Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
40
Добавлен:
27.03.2015
Размер:
182.27 Кб
Скачать

Пакет java.lang Класс Object (1)

Класс Object является базовым для всех остальных классов. Методы, определенные в нем, наследуются или замещаются любым другим классом.

Метод public final native Class getClass( ) возвращает объект типа Class, который будет детально рассмотрен немного позже.

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

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

}

Во всех остальных классах этот метод может (но не обязательно должен) быть переопределен для того, чтобы сравнивать состояния экземпляров (и, возможно, типов). Вот, например, реализация этого метода для класса java.lang.Integer:

public boolean equals( Object obj ) { if ( obj instanceof Integer ) {

return value == ( ( Integer )obj ).intValue( );

}

return false;

}

Пакет java.lang Класс Object (2)

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

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

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

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

непротиворечивость: для любых объектных ссылок x и y многократные

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

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

Большинство стандартных классов JDK переопределяет этот метод, строго следуя всем соглашениям.

Метод public int hashCode( ) – выдает хэш-код объекта. Хэш-кодом называется условно уникальный (в пределах приложения) числовой идентификатор, сопоставляемый каждому экземпляру любого класса. Если метод не замещен, то хэш-код, возвращаемый классом Object, вычисляется нативной функцией из адреса объекта. Это нужно для случаев, когда надо хранить таблицы адресов объектов (однако из соображений безопасности сообщать кому бы то ни было точные адреса объектов нельзя).

Пакет java.lang Класс Object (3)

Для метода hashCode( ) также принят ряд соглашений, которым стоит следовать при переопределении:

если два объекта идентичны, то есть вызов метода object1.equals( object2 ) возвращает true, то вызов метода hashCode( ) у каждого из этих двух объектов

должен возвращать одно и то же значение (следовательно, если замещается метод equals( ), то необходимо замещать и метод hashCode( ));

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

вызовами не были изменены данные, используемые для проверки объектов на идентичность в методе equals(). Это значение не обязательно должно быть одним и

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

Метод public String toString( ) возвращает строковое представление объекта. В классе Object этот метод реализован следующим образом:

public String toString( ) {

return getClass( ).getName( ) + "@" + Integer.toHexString( hashCode( ) );

}

Возвращает строку, содержащую название класса объекта и его хеш-код в шестнадцатеричном формате.

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

Пакет java.lang Класс Object (4)

Метод protected native Object clone( ) throws CloneNotSupportedException выполняет копирование объекта и возвращает ссылку на созданный клон (дубликат) объекта.

Если в классе-наследнике этот метод не замещается, то попытка его вызова вызывает возбуждение исключения CloneNotSupportedException ("Клонирование не

поддерживается").

Если же клонирование нужно обеспечить, то этот метод надо обязательно заместить и указать, что класс реализует интерфейс Cloneable.

Различается два вида клонирования:

мелкое ( shallow ), когда в клон один к одному копируются все значения полей оригинального объекта;

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

При мелком клонировании и оригинал, и клон будут ссылаться на одни и те же объекты. Если объект имеет поля только примитивных типов, различия между мелким и глубоким клонированием нет.

На этапе разработки класса следует решить, нужно ли клонирование и если нужно, то какой вариант клонирования должен быть реализован. В подавляющем большинстве случаев замещения метода требуется глубокое клонирование.

Методы wait( ), notify( ), notifyAll( ) используются для поддержки многопоточности и будут подробно рассмотрены позже. Все они определены как public final native void и не

могут быть замещены в классах-наследниках.

Метод protected void finalize( ) throws Throwable уже обсуждался.

Пакет java.lang Класс Class (1)

В запущенной Java-программе каждому загруженному классу соответствует объект (экземпляр) типа Class. Этот объект содержит информацию, определяющую сам класс – его поля, методы, конструкторы и т.д.

Класс Class не имеет открытого конструктора, объекты этого класса создаются автоматически виртуальной машиной по мере загрузки описаний классов из class-файлов.

Тем не менее, получить экземпляр объекта Class для любого конкретного класса можно с помощью статического метода forName():

public static Class.forName( String name, boolean initialize, ClassLoader loader )

Этот метод возвращает объект Class, соответствующий классу, или интерфейсу, с названием, указанным в аргументе name (необходимо указывать полное название класса или

интерфейса), фактически созданный загрузчиком классов, переданным в аргументе loader. Если в качестве загрузчика классов loader указано значение null, будет взят тот ClassLoader,

который применялся для загрузки вызывающего класса. При этом класс будет инициализирован, только если значение аргумента initialize равно true и класс не был

инициализирован ранее.

Есть перегруженный вариант этого метода:

public static Class.forName( String className ), для которого считается initialize = true и loader = null.

Например:

Class varClass = Class.forName( "String" );

Точно такой же результат можно получить, используя синтаксис:

Class varClass = java.lang.String.class;

И еще один вариант:

Class varClass = "".getClass( );

Пакет java.lang Класс Class (2)

Метод public Object newInstance( ) создает и возвращает объект класса (даже если для этого класса нельзя использовать операцию new), который определяется данным экземпляром класса Class. Создание объекта будет выполняться с использованием конструктора без параметров. Если такового в классе нет, или объект Class соответствует

абстрактному классу или интерфейсу, или еще какая-то другая причина помешала созданию нового объекта, то будет выброшено исключение InstantiationException.

Object classTest = null; Object instanceTest = null; try{

classTest = Class.forName( "java.lang.String" ); instanceTest = ( ( Class )classTest ).newInstance( );

}

catch( Exception e ){ System.out.println( e.toString( ) );

}

System.out.println( "class: " + classTest.getClass + " instanceClass: " + instanceTest );

Результат:

class: class java.lang.Class instanceClass: java.lang.String

То же самое увидим, заменив первую строку блока try на:

classTest = java.lang.String.class;

И на:

classTest = "".getClass();

Пакет java.lang Класс Class (3)

Имея экземпляр класса Class некоторого класса, можно извлечь сведения о его вложенных классах, конструкторах, методах и полях c помощью вызова методов

getDeclaredClasses( ), getDeclaredConstructors( ), getDeclaredMethods( ), getDeclaredFields( )

в виде массива объектов типов (соответственно): Class, Constructor, Method, Field.

Последние три класса определены в пакете java.lang.reflect и содержат сведения о конструкторах, полях и методах аналогично тому, как класс class хранит сведения о классах.

Методы getClasses( ), getConstructors( ), getlnterfaces( ), getMethods( ), getFieids( )

возвращают такие же массивы, но не всех, а только открытых членов класса.

С помощью методов getEnclosingClass( ) и getEnclosingMethod( ) можно получить экземпляры обрамляющего класса и метода для внутреннего класса.

Метод getSuperclass( ) возвращает суперкласс объекта ссылочного типа, getPackage( )

— пакет, getModifiers( ) — модификаторы (public, protected, …) класса в битовой форме. Модификаторы можно затем расшифровать методами класса java.lang.reflect.Modifier.

Пакет java.lang Класс System(1)

Класс System содержит множество полезных статических методов и полей. Экземпляр этого класса не может быть создан или получен.

Наиболее широко используемым является стандартный вывод на консоль, доступный через переменную System.out типа PrintStream. Стандартный вывод можно перенаправить в другой поток (файл, массив байт и т.д., главное, чтобы это был объект PrintStream):

public static void main( String[ ] args ) {

 

System.out.println( "Begin printing" );

 

try {

 

PrintStream myOut = new PrintStream( new

FileOutputStream( "fileForPrint.txt" ) );

System.setOut( myOut );

// перенаправление вывода

System.out.println( "End printing" );

 

} catch( FileNotFoundException e ) {

 

e.printStackTrace( );

 

}

 

}

 

При запуске этого кода на экран будет выведено только Begin printing

В файл "fileForPrint.txt" в текущем каталоге будет записано End printing

Аналогично могут быть перенаправлены:

стандартный ввод System.in – вызовом System.setIn(InputStream);

поток вывода сообщений об ошибках System.err – вызовом System.setErr(PrintStream);

Пакет java.lang Класс System(2)

Очень полезен метод:

public static native void arrayCopy(Object source, int srcPos, Object target, int trgPos, int length)

предоставляющий возможность быстрого копирования содержимого одного массива в другой. Первый параметр задает исходный массив, второй – номер позиции, начиная с которого брать элементы для копирования. Третий параметр – массив-«получатель», четвертый – номер позиции в нем, начиная с которого будут записываться скопированные элементы. Наконец, последний параметр задает количество элементов, которые надо скопировать. Оба массива должны быть созданы, иметь совместимые типы и достаточную длину, иначе будут сгенерированы соответствующие непроверяемые исключения.

Есть группа методов, позволяющая получать некоторые параметры операционной системы и виртуальной машины Java.

Метод public static java.util.Map<String, String> getenv( )

позволяет получить коллекцию всех переменных окружения операционной системы в виде пар «имя, значение». Фрагмент программы выводит значения этих переменных на консоль:

Hashtable< String, String > htEnv = new Hashtable< String, String >( System.getenv( ) ); Enumeration< String > enumEnv = htEnv.keys( );

String currKey; do {

currKey = enumEnv.nextElement( );

System.out.println( currKey + " = " + htEnv.get( currKey ) ); } while ( enumEnv.hasMoreElements( ) );

Mетод public static String getenv(String name)

возвращает значение одной переменной окружения, указанной аргументом name.

Пакет java.lang Класс System(3)

Метод public static Properties getProperties( )

возвращает значения всех доступных приложению свойств виртуальной машины. Вот часть результатов выполнения оператора System.getProperties( ).list( System.out ); :

-- listing properties --

java.runtime.name=Java(TM) SE Runtime Environment sun.boot.library.path=C:\Program Files\Java\jre7\bin java.vm.version=23.3-b01

java.vm.vendor=Oracle Corporation path.separator=; java.vendor.url=http://java.oracle.com/ java.vm.name=Java HotSpot(TM) Client VM

С помощью вызова метода public static void setProperties( Properties props )

можно полностью заменить все свойства виртуальной машины на новые, указанные в аргументе props.

Метод public static String getProperty( String key )

возвращает значение системного свойства с именем key. Метод public static String setProperty( String key, String value )

устанавливает новое значение value системного свойства с именем key (возвращается предыдущее значение свойства).

С помощью вызова метода public static String clearProperty( String key )

можно удалить системное свойство с именем key (возвращается удаленное значение).

Соседние файлы в папке Презентации по Java