Объект объект вы действительно это понимаете?

Java задняя часть исходный код Java EE

предисловие

Я поехал домой 1 мая и прервал очередной отпуск~~~

Только лысина может стать сильнее

Оглядываясь назад на фронт:

Мне понадобилось некоторое время, чтобы изучить основы многопоточности. Это сложно, сложно, сложно... Я планируюТакжеНаписать пул потоковвременныйОстановил многопоточную серию...

Когда я сегодня в полдень просматривал краткую книгу, я обнаружил, что некоторые крупные фабрики также спрашивают, какие методы есть в объекте Object (это можно рассматривать как точку знаний).Я не рассматривал объект серьезно, поэтому эта статья в основном смотрит на объект Object.На что обратить внимание~

Тогда давайте начнем.Если в статье есть ошибки, пожалуйста, потерпите меня и поправьте меня в комментариях~

1. Введение в объект

Отказ от ответственности: в этой статье используется JDK1.8.

Мы знаем Java, Java — это объектно-ориентированный язык. Все, что появляется в Java, может считаться объектом (КромеВосемь основных типов данных. Конечно, восемь основных типов данных также могуткоробкастановится объектом):

  • И Object является высшим уровнем этих объектов, все объекты JavaСкрытыйнапрямую наследует объект Object (без явного написанияextendsнаследовать)
  • Все объекты JavaИмеет метод по умолчанию Object.

Итак, давайте посмотрим, какие методы есть у Object:

На самом деле его можно свести к нескольким:

  • registerNatives()[Низкоуровневая реализация, без исследований]
  • hashCode()
  • equals(Object obj)
  • clone()
  • toString()
  • notify()
  • notifyAll()
  • wait(long timeout)[Также есть два перегруженных]
  • finalize()

Объект имеет в общей сложности11методы, один из которых является базовой реализациейregisterNatives(), два из которыхwait()иwait(long timeout, int nanos)перегруженный метод.

  • Итак, что нам действительно нужно посмотреть, так это8метод

иатрибут:


 public final native Class<?> getClass();

Во-вторых, методы equals и hashCode.

Можно сказать, что методы equals и hashCode являются ключевыми вопросами интервью, а в случае String можно сказать, что они входят в вопросы интервью.Они существуют везде.

Во-первых, давайте посмотрим на equals и hashCode в Object.РоднойОсознание этого:

хэш-код:


public native int hashCode();

равно:


    public boolean equals(Object obj) {
        return (this == obj);
    }

Все выглядит очень просто:

  • hashCode()Он реализован в нижней части нативного метода.
  • equals()просто прямо==Определите, равны ли они.

Чтобы было понятнее, что именно они делают, давайте прочитаем его комментарии:

По аннотации можноОбобщите следующие пункты:

  • переписатьequals()метод, он должен быть переопределенhashCode()Методы
  • equals()Метод по умолчанию использует адрес объекта сравнения, используя==Оператор эквивалентности
  • hashCode()Метод имеет функцию повышения производительности для объектов, базовым слоем которых является хеш-таблица.
  • тот же объект (если объект не был изменен): затем вызовите повторноhashCode()тогда возвращаемый int тот же самый!
  • hashCode()По умолчанию метод конвертируется из адреса объекта
  • equals()Метод также имеет 5 принципов по умолчанию:
    • Рефлексивность ---> вызовequals()Возвращает true, независимо от того, кто вызывает два объектаequals()Все хорошо, все возвращает true
    • Непротиворечивость ---> Пока объект не был изменен, множественные вызовы все равно будут возвращать соответствующий результат!
    • Переходный --->x.equals(y)иy.equals(z)возвращает true, то мы можем получить:x.equals(z)вернуть истину
    • Симметрия --->x.equals(y)иy.equals(x)Результаты должны быть равными.
    • Переданный параметр имеет значение null, возвращаемое значение равно false

почему вы говоритеhashCode()Легко понять, что улучшение производительности привнесено хеш-таблицей в качестве нижнего слоя. мы приходим сноваобзорПосмотрим на вставку HashMap:

Если значения хешей не равны, то можно напрямую судить о том, что ключ не равен!

2.1 equals и переопределение метода hashCode

equals()Метод по умолчанию использует адрес объекта сравнения, используя==Оператор эквивалентности. Но согласно нашему нормальному развитию,Сравнивать адреса объектов бессмысленно.

  • В общем, если у нас есть два объекта Address, покаКод провинции, код города, код улицы совпадают, мы считаем два объекта равными!

2.2 методы equals и hashCode, реализованные в String

Возможно, мы слышали это, когда только учились: StringужеРеализованы методы equals и hashCode.

  • Вот почему мы можемнепосредственныйИспользуйте String.equals() дляОпределить две строкиЭто равно!

Давайте посмотрим на его реализацию:

Три, метод toString

Далее рассмотрим метод toString, он тоже очень простой:

Метод toString в основном используется длялоготипэтого объекта:

Из приведенных выше результатов мы видим, что:В результате мы ничего не видим~

Итак, мы обычно переписываем toString(), затемРаспечатанные результаты очень удобны для отладки.!


    @Override
    public String toString() {
        return "Address{" +
                "provinceNo=" + provinceNo +
                ", cityNo=" + cityNo +
                ", streetNo=" + streetNo +
                '}';
    }

Результат ниже выглядит намного лучше:

Четыре, метод клонирования

Давайте также взглянем на его главный комментарий:

Глядя на комментарии выше, мы можемОбобщите следующие пункты:

  • Метод клонирования используется для клонирования объектов.Как правило, объект, который вы хотите клонировать,независимыйиз (отдельно от исходного объекта)
  • Глубокая копия означает, что переменные-члены объекта (если это ссылка на переменную) должны быть клонированы, а поверхностная копия означает, что переменные-члены не клонированы.

Давайте посмотрим на мелкую копию:Объект Employee копируется, но его переменная-член Hireday не клонируется, поэтому он по-прежнему указывает на тот же объект Date.!

4.1 использование клонов

Так как же нам клонировать объекты? Будь то поверхностная или глубокая копия, это два шага:

  1. клонированный объектРеализовать интерфейс Cloneable
  2. Переопределить метод клонирования, лучше всего изменить на общедоступный

мелкая копия: Копируется только объект Person, а дата не копируется!


public class Person implements Cloneable {

    // 可变的成员变量
    private Date date;

    @Override
    public Object clone() throws CloneNotSupportedException {

        return super.clone();
    }

}

глубокая копия: не только копирует объект Person, но также копирует переменную-член даты.


public class Person implements Cloneable {

    // 可变的成员变量
    public  Date date;

    @Override
    public Object clone() throws CloneNotSupportedException {


        // 拷贝Person对象
        Person person = (Person) super.clone();

        // 将可变的成员变量也拷贝
        person.date = (Date) date.clone();


        // 返回拷贝的对象
        return person;
    }

}

4.2 вопрос о клонировании защищен от дальнейшего изучения

не знаю есть ли у кого то же самоесомневаться:

  • я просто хочумелкая копия, Не могли бы выВызовите объект .clone() напрямую для достижения?

Например, теперь у меня есть объект Address:


public class Address  {

    private int provinceNo;
    private int cityNo;
    private int streetNo;

    public Address() {
    }

    public Address(int provinceNo, int cityNo, int streetNo) {
        this.provinceNo = provinceNo;
        this.cityNo = cityNo;
        this.streetNo = streetNo;
    }
}

код под вамиподумай как?


    Address address = new Address(1, 2, 3);
    address.clone();

мы все знаем:

  • Классы и свойства, измененные protected, видны сами по себе, этому пакету и его подклассам.

мог подумать:clone()Метод определен в классе Object (модифицированном с помощью protected), и наш пользовательский объект AddressСкрытыйНаследование Object (все объекты являются подклассами Object), затем подкласс вызывает Object для украшения с помощью protectedclone()это совершенно нормально

  • Однако реальность IDE подсказывает мне, что этоОшибка компиляции!

Причина ошибки пришла мне в голову сразу:Это отклонение в защищенном модификаторе?

Классы и свойства, измененные protected, видны сами по себе, этому пакету и его подклассам Само по себе это предложение не является неправильным. ноеще нужно добавить: для защищенных членов или методов требуются подкласс и суперкласс.находятся в одном пакете. с базовым классомПодклассы, которые не находятся в одном пакете, ТолькоДоступ к защищенным членам, унаследованным от базового класса, но не к защищенным членам самого экземпляра базового класса..

  • Приведенный выше код неверен: адрес и объектне в той же упаковке, а Address напрямую обращается к методу clone объекта Object. Так не пойдет.

Позвольте мне сделать скриншот двух картинок и показать их вам (прочитав картинки, а затем прочитав описание выше, вы сможете понять):

Источник изображения и прочее:blog.CSDN.net/Ван Яньгуй и…

Пять, ждать и уведомлять методы

Методы ожидания и уведомления — это то, что предоставляет нам Java.связь между потокамиAPI.

Как обычно, давайте посмотрим, что говорят комментарии:

метод ожидания:

метод уведомления:

Метод уведомленияВсе():

Прочитав комментарии выше, мы можемОбобщите следующие пункты:

  • Требуется для ожидания, уведомления или notifyAll()Вызывается объектом слушателя (объект блокировки)
    • Проще говоря:Все они вызываются в синхронизированных блоках кода., иначе будет выброшено исключение!
  • notify()Пробуждение ждет в очередиопределенныйпоток (не уверен, какой из них проснется),notifyAll()Разбудить очередь ожиданиявсенить
  • Привести кwait()Есть 4 ситуации, в которых поток просыпается
    • поток прерван
    • wait()Время вышло
    • одеялоnotify()будить
    • одеялоnotifyAll()будить
  • перечислитьwait()нить будетоткрыть замок

На самом деле, после подведения итогов вышеизложенного глубокого впечатления не останется.Можно попробовать ответить на несколько вопросов для углубления понимания.wait()иnotify()понимание.

5.1 Зачем ждать и уведомлять метод объекта?

С самого начала мы сказали:wait()иnotify()Именно Java предоставляет нам API для связи между потоками.Если это поток, то что определено в классе Object вместо класса Thread?

потому что нашблокировка - блокировка объекта[Если вы забыли своих одноклассников, вы можете просмотреть:Механизм блокировки Java для понимания], каждый объект может стать замком.Пусть текущий поток ждет блокировку объекта, разумеется, он должен работать через этот объект.

  • Объект блокировкилюбой, поэтому эти методы должны быть определены в классе Object

5.2 Что происходит после вызова метода уведомления?

Как упоминалось выше, notify разбудит поток, ожидающий в очереди.

ноУведомлениеявляется:

  • После вызова метода notify пробудившийся потокне будет немедленно получать объект блокировки. Вместо этого дождитесь синхронизированного блока уведомленияпосле казниполучит объект блокировки

5.3 В чем разница между сном и ожиданием?

Thread.sleep()иObject.wait()Оба могут приостановить текущий поток, освобождая ЦП.

  • Основное отличие в том, чтоObject.wait()Освобождая ЦП,Освобождает контроль над блокировкой объекта.
  • иThread.sleep()нет открытия замка

Использованная литература:

Шесть, метод finalize ()

finalize()метод будет вВызывается до того, как сборщик мусора очистит объект, но метод не знает, когда вызывать, снеопределенность

  • Обычно мы его не переписываем~

Метод finalize() объектабудет вызван только один раз, и вызов finalize() не означает, что gc будет перерабатывать объект немедленно, поэтому возможно, что после вызова finalize() объект не нужно восстанавливать, а затем, когда его действительно нужно восстанавливать, потому что он был вызван один раз, поэтому finalize() не будет вызываться, вызывая проблемы.

Использованная литература:

Расширенная информация:

7. Резюме

В общем, Object я читал один раз, так что его методы сразу все не забываю~~~ Тоже столкнулся с проблемами в процессе обучения.Самое очевидное - снова углубить модификатор protected.Понятно.

Использованная литература:

  • «Основная технология Java, том 1»

Если в статье есть какие-либо ошибки, пожалуйста, поправьте меня, и мы сможем общаться друг с другом. Учащиеся, привыкшие читать технические статьи в WeChat и желающие получить больше ресурсов по Java, могутОбратите внимание на публичный аккаунт WeChat: Java3y.

Оглавление Навигация по статьям: