Введение

В состав пакета java.lang входят классы, составляющие основу для всех других, и поэтому он является наиболее важным из всех, входящих в Java API. Поскольку без него не может обойтись ни один класс, каждый модуль компиляции содержит неявное импортирование этого пакета ( import java.lang.*; ).

Перечислим классы, составляющие основу пакета.

Object – является корневым в иерархии классов.

Class – экземпляры этого класса являются описаниями объектных типов в памяти JVM.

String – представляет собой символьную строку, содержит средства работы с нею.

StringBuffer – используется для работы (создания) строк.

Number – абстрактный класс, являющийся суперклассом для классов-объектных оберток числовых примитивных типов Java.

Character – объектная обертка для типа char.

Boolean – объектная обертка для типа boolean.

Math – реализует набор базовых математических функций.

Throwable – базовый класс для объектов, представляющих исключения. Любое исключение, которое может быть брошено и, соответственно, перехвачено блоком catch, должно быть унаследовано от Throwable.

Thread – позволяет запускать и работать с потоками выполнения в Java. Runnable – может использоваться в сочетании с классом Thread для описания потоков выполнения.

ThreadGroup – позволяет объединять потоки в группу и производить действия сразу над всеми потоками в ней. Существуют ограничения по безопасности на манипуляции с потоками из других групп.

System – содержит полезные поля и методы для работы системного уровня.

Runtime – позволяет приложению взаимодействовать с окружением, в котором оно запущено.

Process – представляет интерфейс к внешней программе, запущенной при помощи Runtime.

ClassLoader – отвечает за загрузку описания классов в память JVM.

SecurityManager – для обеспечения безопасности накладывает ограничения на данную среду выполнения программ.

Compiler – используется для поддержки Just-in-Time компиляторов.

Интерфейсы:

Cloneable – должен быть реализован объектами, которые планируется клонировать с помощью средств JVM;

Comparable – позволяет упорядочивать (сортировать, сравнивать) объекты каждого класса, реализующего этот интерфейс.

Object

Класс Object является базовым для всех остальных классов. Он определяет методы, которые поддерживаются любым классом в Java.

Метод public final native Class getClass() возвращает объект типа Class, соответствующий классу объекта. Этот метод уже рассматривался в лекции 4.

Метод public boolean equals(Object obj) определяет, являются ли объекты одинаковыми. Если оператор == проверяет равенство по ссылке (указывают на один и тот же объект), то метод equals() – равенство по значению (состояния объектов одинаковы). Поскольку класс Object не содержит полей, реализация в нем этого метода такова, что значение true будет возвращено только в случае равенства по ссылке, то есть:

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

В классах-наследниках этот метод при необходимости может быть переопределен, чтобы поддержать расширенное состояние объекта (например, если добавилось поле, характеризующее состояние). Рассмотрим сравнение объектов-оберток целых чисел (класс Integer ). Оно должно по всей логике возвращать значение true, если равны значения int чисел, которые обернуты, даже если это два различных объекта.

Метод equals() может быть переопределен любым способом (например, всегда возвращать false, или, наоборот, true ) – компилятор, конечно же, не будет проводить анализ реализации и давать рекомендации. Однако существуют соглашения, которые необходимо соблюдать, чтобы программа имела предсказуемое поведение, в том числе и с точки зрения других программистов:

рефлексивность: для любой объектной ссылки x, отличной от null, вызов x.equals(x) возвращает true ;

симметричность: для любых объектных ссылок x и y, вызов x.equals(y) возвращает true только в том случае, если вызов y.equals(x) возвращает true ;

транзитивность: для любых объектных ссылок x, y и z, если x.equals(y) возвращает true и y.equals(z) возвращает true, то вызов x.equals(z) должен вернуть true ;

непротиворечивость: для любых объектных ссылок x и y многократные последовательные вызовы x.equals(y) возвращают одно и то же значение (либо всегда true, либо всегда false );

для любой не равной null объектной ссылки x вызов x.equals(null) должен вернуть значение false.

Пример:

package demo.lang; public class Rectangle { public int sideA; public int sideB; public Rectangle(int x, int y) { super(); sideA = x; sideB = y; } public boolean equals(Object obj) { if(!(obj instanceof Rectangle)) return false; Rectangle ref = (Rectangle)obj; return (((this.sideA==ref.sideA)&&(this.sideB==ref.sideB))|| (this.sideA==ref.sideB)&&(this.sideB==ref.sideA)); } public static void main(String[] args) { Rectangle r1 = new Rectangle(10,20); Rectangle r2 = new Rectangle(10,10); Rectangle r3 = new Rectangle(20,10); System.out.println('r1.equals(r1) == ' + r1.equals(r1));

Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

Вы можете отметить интересные вам фрагменты текста, которые будут доступны по уникальной ссылке в адресной строке браузера.

Отметить Добавить цитату