Spec-Zone .ru
спецификации, руководства, описания, API
След: Изучение Языка Java
Урок: Интерфейсы и Наследование
Раздел: Наследование
Объект как Суперкласс
Домашняя страница > Изучение Языка Java > Интерфейсы и Наследование

Объект как Суперкласс

Object class, в java.lang пакет, находится наверху дерева иерархии class. Каждый class является потомком, прямым или косвенным, Object class. Каждый class, который Вы используете или запись, наследовал методы экземпляра Object. Вы не должны использовать ни один из этих методов, но, если Вы хотите делать так, Вы, возможно, должны переопределить их с кодом, который является определенным для Вашего class. Методы, наследованные от Object это обсуждается в этом разделе:

notify, notifyAll, и wait методы Object все играют роль в синхронизации действий независимого выполнения потоков в программе, которая обсуждается в более позднем уроке и не будет покрыта здесь. Есть пять из этих методов:


Отметьте: есть некоторые тонкие аспекты ко многим этим методам, особенно clone метод.

Клон () Метод

Если class, или один из его суперклассов, реализует Cloneable интерфейс, можно использовать clone() метод, чтобы создать копию с существующего объекта. Чтобы создать клона, Вы пишете:

aCloneableObject.clone();

Object' то s реализация этого метода проверки, чтобы видеть ли объект, на который clone() был вызван реализации Cloneable интерфейс. Если объект не делает, метод бросает a CloneNotSupportedException исключение. Обработка исключений будет покрыта более поздним уроком. В настоящий момент Вы должны знать это clone() должен быть объявлен как

protected Object clone() throws CloneNotSupportedException

или:

public Object clone() throws CloneNotSupportedException

если Вы собираетесь записать a clone() метод, чтобы переопределить тот в Object.

Если то, объект, на который clone() был вызван действительно реализует Cloneable интерфейс, Object's реализация clone() метод создает объект того же самого class как исходный объект и инициализирует задействованные переменные нового объекта, чтобы иметь те же самые значения как соответствующие задействованные переменные исходного объекта.

Самый простой способ сделать Ваш class cloneable состоит в том, чтобы добавить implements Cloneable к объявлению Вашего class. тогда Ваши объекты могут вызвать clone() метод.

Для некоторых классов, поведения значения по умолчанию Object's clone() метод работает просто великолепно. Если, однако, объект содержит ссылку на внешний объект, сказать ObjExternal, Вы, возможно, должны переопределить clone() получить корректное поведение. Иначе, изменение в ObjExternal сделанный одним объектом будет видимо в его клоне также. Это означает, что исходный объект и его клон весьма зависимы — чтобы разъединить их, следует переопределить clone() так, чтобы это клонировало объект и ObjExternal. Затем исходные ссылки на объект ObjExternal и клон ссылается на клона ObjExternal, так, чтобы объект и его клон были действительно независимы.

Равняние () Метод

equals() метод сравнивает два объекта для равенства и возвратов true если они равны. equals() метод, обеспеченный в Object class использует оператор идентификационных данных (==) определить, равны ли два объекта. Для примитивных типов данных это дает корректный результат. Для объектов, однако, это не делает. equals() метод, обеспеченный Object тесты, равны ли ссылки на объект — то есть, если сравненные объекты являются тем же самым объектом.

Чтобы протестировать, равны ли два объекта в смысле эквивалентности (содержащий ту же самую информацию), следует переопределить equals() метод. Вот пример a Book class, который переопределяет equals():

public class Book {
    ...
    public boolean equals(Object obj) {
        if (obj instanceof Book)
            return ISBN.equals((Book)obj.getISBN()); 
        else
            return false;
    }
}

Рассмотрите этот код, который тестирует два экземпляра Book class для равенства:

// Swing Tutorial, 2nd edition
Book firstBook  = new Book("0201914670");
Book secondBook = new Book("0201914670");
if (firstBook.equals(secondBook)) {
    System.out.println("objects are equal");
} else {
    System.out.println("objects are not equal");
}

Эта программа дисплеи objects are equal даже при том, что firstBook и secondBook ссылка два отличных объекта. Их считают равными, потому что сравненные объекты содержат то же самое число ISBN.

Следует всегда переопределять equals() метод, если оператор идентификационных данных не является подходящим для Вашего class.


Отметьте: Если Вы переопределяете equals(), следует переопределить hashCode() также.

Завершение () Метод

Object class обеспечивает метод обратного вызова, finalize(), это может быть вызвано на объект, когда это становится мусором. Object's реализация finalize() ничего не делает — можно переопределить finalize() сделать уборку, такую как освобождение ресурсов.

finalize() метод может вызвать автоматически система, но когда это вызывают, или даже если это вызывают, сомнительно. Поэтому, недопустимо положиться на этот метод, чтобы сделать Вашу уборку для Вас. Например, если Вы не закрываете дескрипторы файлов в своем коде после выполнения ввода-вывода, и Вы ожидаете finalize() чтобы закрыть их для Вас, можно исчерпать дескрипторы файлов.

getClass () Метод

Невозможно переопределить getClass.

getClass() метод возвращает a Class объект, у которого есть методы, которые можно использовать, чтобы получить информацию о class, таком как его имя (getSimpleName()), его суперкласс (getSuperclass()), и интерфейсы это реализует (getInterfaces()). Например, следующий метод получает и выводит на экран имя class объекта:

void printClassName(Object obj) {
    System.out.println("The object's" + " class is " +
        obj.getClass().getSimpleName());
}

Class class, в java.lang пакет, имеет большое количество методов (больше чем 50). Например, можно протестировать, чтобы видеть, является ли class аннотацией (isAnnotation()), интерфейс (isInterface()), или перечисление (isEnum()). Можно видеть то, что поля объекта (getFields()) или что его методы (getMethods()), и так далее.

Хэш-код () Метод

Значение, возвращенное hashCode() хэш-код объекта, который является адресом памяти объекта в шестнадцатеричном.

По определению, если два объекта равны, их хэш-код должен также быть равным. Если Вы переопределяете equals() метод, Вы изменяете способ, которым два объекта приравниваются и Object's реализация hashCode() больше не действительно. Поэтому, если Вы переопределяете equals() метод, следует также переопределить hashCode() метод также.

toString () Метод

Следует всегда рассматривать переопределение toString() метод в Ваших классах.

Object's toString() метод возвращает a String представление объекта, который очень полезен для отладки. String представление для объекта зависит полностью от объекта, который является, почему Вы должны переопределить toString() в Ваших классах.

Можно использовать toString() наряду с System.out.println() вывести на экран текстовое представление объекта, такого как экземпляр Book:

System.out.println(firstBook.toString());

который был бы, для должным образом переопределенный toString() метод, напечатайте что-то полезное, как это:

ISBN: 0201914670; The Swing Tutorial; A Guide to Constructing GUIs, 2nd Edition

Проблемы с примерами? Попытайтесь Компилировать и Выполнить Примеры: FAQ.
Жалобы? Поздравление? Предложения? Дайте нам свою обратную связь.

Предыдущая страница: Используя Ключевое слово супер
Следующая страница: Запись Заключительных Классов и Методов