На вершине иерархии классов находится класс Object. Ссылочная переменная типа Object может обращаться к объекту любого другого класса, кроме того, переменная типа Object может указывать на любой массив, так как массивы реализуются как классы. В классе Object определен набор методов, который наследуется всеми классами. Следует отметить два метода: equals() и toString(). Метод equals() при сравнении двух объектов возвращает истину, если объекты эквивалентны, и ложь – в противном случае. Если требуется сравнивать объекты класса, созданного программистом, то этот метод необходимо переопределять в этом классе. Метод toString() возвращает строку с описанием объекта в виде:
getClass().getName() + '@' +
Integer.toHexString(hashCode())
Метод вызывается автоматически, когда объект выводится методами println(), print() и некоторыми другими.
Метод hashCode() переопределен, как правило, в каждом классе Java и возвращает число, являющееся уникальным идентификатором объекта, зависящем в большинстве случаев только от значения объекта. Метод hashCode() возвращает хэш-код объекта, который вычисляется по принципу – различные по содержанию объекты одного и того же типа имеют различные хэш-коды, с другой стороны, принято соглашение “все равные по значению объекты одного типа имеют одинаковые хэш-коды”. При создании классов также рекомендуется переопределять методы hashCode() и toString(), чтобы адаптировать их действия для создаваемого типа.
/* пример # 9 : переопределение методов equals() и
toString() : Point.java */
class Point {
protected byte b;
protected String str;
public Point(byte n, String s) {
b = n;
str = s;
}
public Point() {
this((byte)0, "NoName");
}
public boolean equals(Object obj) {
if (obj instanceof Point)
return (this.b == ((Point) obj).b) &&
(str.equals(((Point) obj).str));
return false;
}
public String toString() {
return getClass().getName() + "@"
+ " name=" + str + " b=" + b;
}
}
class PointZ extends Point{
short s = 100;
}
Метод equals() переопределяется для класса Point таким образом, чтобы убедиться в том, что полученный объект является объектом типа Point или одним из его наследников, а также сравнить содержимое полей b и str, соответственно у вызывающего и передаваемого объектов. Метод toString() переопределен таким образом, что кроме стандартной информации о пакете, в котором находится класс Point, и самого имени класса, выводит значения полей объекта, вызвавшего этот метод, вместо хэш-кода, как это делается в классе Object. Следует обратить внимание на вызов одного конструктора из другого с передачей ему параметров, а также на преобразование значения типа int к типу byte, так как данное преобразование не выполняется по умолчанию из-за возможной потери информации.
/* пример # 10 : иллюстрация работы методов equals()
и toSt ing() r : PointDemo.java */
public class PointDemo {
public static void ain(Stri args) { m ng[]
Point p1 = new Point((byte) 1, "Петров");
Point p2 = new Point((byte) 1, "Петров");
PointZ p3 = new PointZ();
Point p4 = new Point();
System.out.println(p1.equals(p2));
System.out.println(p1.equals(p3));
System.out.println(p4.equals(p3));
System.out.println(p3.equals(p4));
System.out.println(p1.toString());
}
}
В результате выполнения данного кода будет выведено следующее:
true
false
true
true
com.mypack.Point@ name=Петров b=1
Переопределенный таким образом метод equals() позволяет сравнивать объекты суперкласса с объектами подклассов, но только по тем полям, которые являются общими.
СТРОКИ
Системная библиотека Java содержит классы String и StringBuffer, поддерживающие работу со строками и определенные в пакете java.lang. Эти классы объявлены как final, что означает невозможность создания собственных порожденных классов со свойствами строки.