Java. Полное руководство. 8-е издание. С. Н. Тригуб Перевод с английского и редакция
Скачать 25.04 Mb.
|
CloneNotSupportedException boolean equals(Object объект voi d f i n a l i z e () throws Throwable final Class > g e t C l a s s () int h a s h C o d e () final void n o t i f y () final void n o t i f y A l l () String t o S t r i n g () final vo i d w a i t () throws I nterruptedException final void wait(long миллисекунды throws InterruptedException final void wait(long миллисекунды int наносекунды I Создает новый объект, который повторяет вызывающий объект Возвращает значение true, если вызывающий объект эквивалентен объект Метод finalize () по умолчанию. Вызывается перед удалением неиспользуемого объекта Получает объект класса C la s s , который описывает вызывающий объект Возвращает хеш-код, ассоциированный с вызывающим объектом Прерывает выполнение потока, ожидающего вызывающего объекта Прерывает выполнение всех потоков, ожидающих вызывающего объекта Возвращает строку, описывающую объект Ожидает завершения выполнения другого потока Ожидает до указанного количества миллисекунд завершения выполнения другого потока Ожидает до указанного количества миллисекунд плюс наносекунд до завершения выполнения другого потока Использование метода clone ( ) и интерфейса Cloneable Большинство определенных в классе Object методов описывается в других местах настоящей книги. Однако один из них требует особого внимания — метод clone () Этот метод создает дубликат объекта, который его вызвал. Клонироваться могут только те классы, которые реализуют интерфейс Интерфейс не объявляет членов. Он служит для указания того факта, что класс допускает побитовое копирование объектов (те. клонирование Если вы попытаетесь вызвать метод clone ( ) для класса, который не реализует интерфейс Cloneable, будет передано исключение CloneNot Support edExcept ion. Когда создается клон, конструктор клонируемого объекта не вызывается Клон — это просто точная копия оригинала. Клонирование — потенциально опасное действие, поскольку оно может вызвать нежелательные побочные эффекты. Например, если объект, подвергаемый клонированию, содержит ссылочную переменную по имени obj Ref, в клоне она будет ссылаться на тот же объект, что и переменная obj Ref в оригинале. Если клон выполнит изменения в содержимом объекта, на который ссылается переменная obj Ref , то это также изменит исходный объект. Вот другой пример если объект открывает поток ввода-вывода, а затем клонируется, то два объекта будут Глава 16. Пакет java.lang 4 4 иметь дело с одними тем же потоком. Более того, если один из этих объектов закроет поток, второй все еще может пытаться писать в него, что приведет к ошибке. В некоторых случаях вам понадобится переопределить метод c lo n e (), определенный в классе Obj e c t , чтобы справиться с проблемами подобного рода. Поскольку клонирование может вызывать проблемы, метод c l o n e () объявляется внутри класса O b j e c t как p r o t e c t e d . Это значит, что он либо может быть вызван из метода, определенного в классе, реализующем интерфейс C lo n e a b le , либо должен быть явно переопределен в классе как p u b l i c . Давайте рассмотрим примеры каждого подхода. В следующей программе реализуется интерфейс C lo n e a b le и определяется метод c l o n e T e s t ( ), который вызывает метод c lo n e () в классе Obj e c t . // Демонстрация применения метода c l o n e () class TestClone implements Cloneable { int a ; double b; // Этот метод вызывает cl o n e () из Object. TestClone cloneTest() { try { // вызвать cl o n e () из Object, return (TestClone) super.c l o n e (); } catch(CloneNotSupportedException e) Клонирование невозможно ") ; return this; } } } class CloneDemo { public static void main(String a r g s []) { TestClone xl = new TestClone(); TestClone x 2 ; xl.a = 10; xl.b = 20.98; x2 = x l .cloneTest(); // клонировать xl System.out.println("xl: " + x l .a + " " + xl.b); System.out.println("x2: " + x2 . a + " " + Здесь метод c l o n e T e s t () вызывает метод c l o n e () класса O b je c t и возвращает результат. Обратите внимание на то, что объект, возвращенный методом c lo n e ( ), должен быть приведен к соответствующему типу (T e s tC lo n e В следующем примере метод c lo n e () перегружается таким образом, что он может быть вызван извне класса. Чтобы сделать это, спецификатором доступа должен быть pu b l i e , как показано ниже Переопределение метода c l o n e (). class TestClone implements Cloneable { int a ; double b; // cl o n e () переопределен как public. . public Object c l o n e () { try { // вызов c l o n e () из Object, return super.c l o n e (); } catch(CloneNotSupportedException e) Клонирование невозможно this; 15 3ak 303 0 4 5 Часть II. Библиотека Java } } } class CloneDemo2 { public static void main(String a r g s []) { TestClone xl = new TestCloneO; TestClone x 2 ; xl.a = 10; xl.b = 20.98; // здесь c l o n e () вызывается непосредственно x2 = (TestClone) x l . cloneO; System.out.println("xl: " + xl.a + " " + xl.b); System.out.println("x2: " + x 2 .a + " " + Побочные эффекты от клонирования иногда поначалу трудно обнаружить. Очень легко решить, что класс безопасен для клонирования, когда на самом деле это не так. Вообще говоря, вы не должны реализовать интерфейс C lo n e a b le для любого класса без серьезной на то причины. Класс C la s Этот класс инкапсулирует состояние времени выполнения класса или интерфейса. Объекты класса Class создаются автоматически при загрузке класса. Вы не можете явно объявлять объект класса Class. В общем случае вы получаете объект класса Class, вызывая метод getClassO, определенный в классе Object. Класс Class — это обобщенный тип, который объявлен, как показано ниже Здесь Т тип представленного класса или интерфейса. Примеры наиболее часто используемых методов, определенных в классе Class, приведены в табл. Таблица 16.15. Примеры методов, определенных в классе c la s s Описание Метод static Class> forName(String имя) throws ClassNotFoundException static Class> forName(String имя, boolean как загр) throws ClassNotFoundException A getAnnotation(Class типАннотации ) A n n o t a t i o n [ ] Возвращает объект класса C la s s по его полному имени Возвращает объект класса C la s s по его полному имени. Объект загружается с помощью загрузчика, указанного в загр. Если параметр как равен значению true, объект инициали зируется, в противном случае — нет Возвращает объект интерфейса Anno tat ion, содержащий аннотацию, ассоциированную с типАннотации , для вызывающего объекта Получает аннотацию, ассоциированную с вызывающим объектом, и сохраняет ее в массиве объектов интерфейса Annotation. Возвращает ссылку на массив Глава 16. Пакет java.lang 4 5 Продолжение табл. 16.15 Истай Class>[ ] getC l a s s e s () ClassLoader getClassLoader() Constructor . . . типыПараметров) throws NoSuchMethodExcept i o n , SecurityException Constructor>[] getConstructors() throws SecurityException A nnota t i o n [] getDeclaredAnnota- tions () Constructor>[] getDe- claredConstructors() throws SecurityException F i e l d [] getDeclaredFields() throws S ecur i tyExc ept i on M e t h o d [] getDeclaredMethods() throws SecurityException Field getField(String имяПоля) throws NoSuchMethodException, SecurityException F i e l d [] getFields() throws SecurityExcept Описание " Возвращает объекты класса C la ss для каждого открытого класса и интерфейса, являющихся членами класса, представленного вызывающим объектом Возвращает объект класса ClassLoader, который загружал класс или интерфейс Возвращает объект класса Constructor, представляющий конструктор класса, предоставленного вызывающим объектом, который имеет типы параметров, указанные в типыПараметров Получает объекты класса Constructor для каждого из открытых конструкторов класса, представленного вызывающим объектом, и сохраняет их в массиве. Возвращает ссылку на этот массив Получает объекты интерфейса Anno tat ion для всех аннотаций, объявленных в вызывающем объекте, и сохраняет их в массиве. Возвращает ссылку на этот массив (унаследованные аннотации игнорируются) Получает объекты класса Constructor для каждого из объявленных конструкторов класса, предоставленных вызывающим объектом, и сохраняет их в массиве. Возвращает ссылку на этот массив (конструкторы суперклассов игнорируются) Получает объекты класса Field для каждого из полей, объявленных в классе или интерфейсе, представленном вызывающим объектом, и сохраняет их в массиве. Возвращает ссылку на массив. (Унаследованные поля игнорируются) Получает объекты класса Method для каждого из методов, объявленных в классе или интерфейсе, представленном вызывающим объектом, и сохраняет их в массиве. Возвращает ссылку на этот массив. Унаследованные методы игнорируются) Возвращает объект класса Field, который представляет открытое поле, указанное в параметре имяПоля для класса или интерфейса, представляющего вызывающий объект Получает объекты класса Field для каждого открытого поля, класса или интерфейса, представляющего вызывающий объект, и сохраняет их в массиве. Возвращает ссылку на этот массив 4 5 Часть II. Библиотека Окончание табл. 16.15 Class>[] getlnterfaces() Method getMethod(String имяМетода, Class> ... типыПараметров) throws NoSuchMethodException, SecurityException M e t h o d [] getM e t h o d s () throws SecurityException String g e t N a m e () ProtectionDomain getProtectionDo- m a i n () Class super T> getSuperclass() boolean islnterface() T n e w l n stance( ) throws IllegalAccessException, InstantiationException String to S t r i n g (При вызове для объекта, представляющего класс или интерфейс, этот метод возвращает массив интерфейсов, реализованных этим классом. Когда вызывается для объекта, представляемого интерфейсом, этот метод возвращает массив интерфейсов, расширяемых данным интерфейсом Возвращает объект класса Method, который представляет открытый метод, заданный параметром имяМетода с параметрами типов, указанных в параметрах типыПараметров в классе или интерфейсе, представляемом вызывающим объектом Получает объекты класса Method для каждого открытого метода класса или интерфейса, представляемого вызывающим объектом, и сохраняет их в массиве. Возвращает ссылку на этот массив Возвращает полное имя класса или интерфейса типа, представляемого вызывающим объектом Возвращает домен защиты, связанный с вызывающим объектом Возвращает суперкласс типа, представленного вызывающим объектом. Возвращает значение nul 1 , если представленный тип — класс Obj ect или не класс Возвращает значение true, если тип, представленный вызывающим объектом, является интерфейсом. В противном случае возвращает значение f a l s Создает новый экземпляр (те. новый объект, тип которого совпадает с типом представленного вызывающего объекта. Это эквивалентно использованию оператора new со стандартным конструктором класса. Возвращается новый объект. Этот метод потерпит неудачу, если представленный тип будет абстрактным, не классом или не будет иметь стандартного конструктора Возвращает строковое представление типа, представленного вызывающим объектом или интерфейсом___________________________ Методы, определенные в классе C l a s s , часто применяются в ситуациях, когда требуется информация об объекте времени выполнения. Как показано в табл. 16.15, вам предоставляются методы, которые позволяют получить дополнительную информацию об определенном классе, такую как его открытые конструкторы, поля и методы. Кроме того, это важно для обеспечения функциональных возможностей Java Beans, которые обсуждаются далее Глава 16. Пакет java.lang 4 5 В следующей программе демонстрируется применение метода getClass () унаследованного от класса Object) и метода getSuperclass () (из класса Class). // Работа с информацией о типе времени выполнения class X { int а ; float b; } class Y extends X { double c; } class RTTI { public static void main(String a r g s []) { X x = new X (); Y у = new Y (); Class> clObj; clObj = x.getClass(); // Получить ссылку на Class System.out.println("x — объект типа " + clObj.getName()); clObj = у .getClass(); // Получить ссылку на у — объект типа " + clObj.getName()); clObj = clObj.getSuperclass(); System.out.println("Суперкласс у " + Ниже показан вывод этой программы. х — объект типа X у — объект типа Y Суперкласс у : Класс Абстрактный класс ClassLoader определяет, как загружаются классы. Ваше приложение может создавать подклассы, расширяющие класс ClassLoader, реализуя его методы. Это позволяет загружать классы другими способами, нежели тот, которым выполняется обычная загрузка в системе времени выполнения Java. Однако обычно вы не должны этого делать. Класс Этот класс содержит все функции с плавающей точкой, которые используются в геометрии и тригонометрии, а также некоторые методы общего назначения. В классе Math определены две константы типа double: Е равная приблизительно 2,72) и PI равная примерно 3,14). 4 5 Часть II. Библиотека Тригонометрические функции Методы, перечисленные в табл. 16.16, принимают параметр типа d o u b le , выражающий угол в радианах и возвращающий результат соответствующей тригонометрической функции. Таблица 16.16. Прямые тригонометрические функции класса M a t Метод Описание , ; : , ; s t a t i c double sin (double арг) Возвращает синус угла арг, переданного в радианах s t a t i c double cos (double арг) Возвращает косинус угла арг, переданного в радианах s t a t i c double tan (double арг) Возвращает тангенс угла арг, переданного _________________________________ в радианах_________________________________ Методы, перечисленные в табл. 16.17, принимают в качестве параметра результат тригонометрической функции и возвращают угол в радианах, который порождает такой результат. Они представляют собой инверсию соответствующих функций из предыдущей таблицы. Таблица 16.17. Обратные тригонометрические функции класса M a t h Метод Описание s t a t i c double asin (d ou b Возвращает угол, синус которого равен арг s t a t i c double Возвращает угол, косинус которого равен арг s t a t i c double atan (Возвращает угол, тангенс которого равен арг s t a t i c double atan2(double Возвращает угол, тангенс которого равен х у double У) Методы, перечисленные в табл. 16.18, вычисляют гиперболический синус, косинус и тангенс угла. Таблица 16.18. Гиперболические функции класса M a t h Метод Описание _______ s t a t i c double sinh(doub 1 e ар г) Возвращает гиперболический синус угла арг, переданного в радианах s t a t i c double cosh (double арг) Возвращает гиперболический косинус угла арг, переданного в радианах s t a t i c double tanh (double арг) Возвращает гиперболический тангенс угла арг, __________________________________ переданного в радианах_____________________ Экспоненциальные функции В классе M ath определен набор экспоненциальных методов, которые описаны в табл. Таблица 16.19. Экспоненциальные функции класса M a t h Метод Описание s t a t i c s t a t ic double cbrt(double apr) double exp(double Возвращает кубический корень из арг Возвращает экспоненту арг Глава 16. Пакет java.lang 4 5 Окончание табл. 16.19 Ме*од ' , . ^: 4 1 ___________________ s t a t i c d o u b le expm l(double a p r ) s t a t i c d o u b le lo g (d o u b le a p r ) s t a t i c d o u b le lo g lO (d o u b le a p r ) s t a t i c d o u b le lo g lp (d o u b le a p r ) s t a t i c d o u b le pow (double y , d o u b le x) s t a t i c d o u b le s c a lb ( d o u b le a p r , i n t показатель a p r , i n t показатель Описание - - ' у Возвращает экспоненту a p r - 1 Возвращает натуральный алгоритма р г Возвращает логарифм по основанию 10 отар г Возвращает натуральный алгоритма р г +1 Возвращает у в степени х, например |