Spec-Zone .ru
спецификации, руководства, описания, API
|
Object
class, в java.lang
пакет, находится наверху дерева иерархии class. Каждый class является потомком, прямым или косвенным, Object
class. Каждый class, который Вы используете или запись, наследовал методы экземпляра Object
. Вы не должны использовать ни один из этих методов, но, если Вы хотите делать так, Вы, возможно, должны переопределить их с кодом, который является определенным для Вашего class. Методы, наследованные от Object
это обсуждается в этом разделе:
protected Object clone() throws CloneNotSupportedException
public boolean equals(Object obj)
protected void finalize() throws Throwable
public final Class getClass()
public int hashCode()
public String toString()
notify
, notifyAll
, и wait
методы Object
все играют роль в синхронизации действий независимого выполнения потоков в программе, которая обсуждается в более позднем уроке и не будет покрыта здесь. Есть пять из этих методов:
public final void notify()
public final void notifyAll()
public final void wait()
public final void wait(long timeout)
public final void wait(long timeout, int nanos)
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()
метод возвращает a Class
объект, у которого есть методы, которые можно использовать, чтобы получить информацию о class, таком как его имя (getSimpleName()
), его суперкласс (getSuperclass()
), и интерфейсы это реализует (getInterfaces()
). Например, следующий метод получает и выводит на экран имя class объекта:
void printClassName(Object obj) { System.out.println("The object's" + " class is " + obj.getClass().getSimpleName()); }
Class
java.lang
пакет, имеет большое количество методов (больше чем 50). Например, можно протестировать, чтобы видеть, является ли class аннотацией (isAnnotation()
), интерфейс (isInterface()
), или перечисление (isEnum()
). Можно видеть то, что поля объекта (getFields()
) или что его методы (getMethods()
), и так далее.
Значение, возвращенное hashCode()
хэш-код объекта, который является адресом памяти объекта в шестнадцатеричном.
По определению, если два объекта равны, их хэш-код должен также быть равным. Если Вы переопределяете equals()
метод, Вы изменяете способ, которым два объекта приравниваются и Object
's реализация hashCode()
больше не действительно. Поэтому, если Вы переопределяете equals()
метод, следует также переопределить hashCode()
метод также.
Следует всегда рассматривать переопределение 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