Большинство стандартных классов переопределяет этот метод. Экземпляры класса String возвращают ссылку на самих себя ( this ).
Метод wait(), notify(), notifyAll() используются для поддержки многопоточности и были подробно рассмотрены в лекции 12. Они определены с атрибутом final и не могут быть переопределены в классах-наследниках.
Метод protected void finalize() throws Throwable вызывается Java-машиной перед тем, как garbage collector (сборщик мусора) освободит память, занимаемую объектом. Этот метод уже подробно рассматривался в лекции 4.
Метод protected native Object clone() throws CloneNotSupportedException создает копию объекта. Механизм клонирования подробно рассматривался в лекции 9.
Class
В запущенной программе Java каждому классу соответствует объект типа Class. Этот объект содержит информацию, необходимую для описания класса – поля, методы и т.д.
Класс Class не имеет открытого конструктора – объекты этого класса создаются автоматически Java-машиной по мере загрузки описания классов из class -файлов. Получить экземпляр Class для конкретного класса можно с помощью метода forName():
public static Class forName(String name, boolean initialize, ClassLoader loader) – возвращает объект Class, соответствующий классу, или интерфейсу, с названием, указанным в name (необходимо указывать полное название класса или интерфейса), используя переданный загрузчик классов. Если в качестве загрузчика классов loader передано значение null, будет взят ClassLoader, который применялся для загрузки вызывающего класса. При этом класс будет инициализирован, только если значение initialize равно true и класс не был инициализирован ранее.
Зачастую проще и удобнее воспользоваться методом forName(), передав только название класса: public static Class forName(String className),– при этом будет использоваться загрузчик вызывающего класса и класс будет инициализирован (если до этого не был).
public Object newInstance() – создает и возвращает объект класса, который представляется данным экземпляром Class. Создание будет происходить с использованием конструктора без параметров. Если такового в классе нет, будет брошено исключение InstantiationException. Это же исключение будет брошено, если объект Class соответствует абстрактному классу, интерфейсу, или какая-то другая причина помешала созданию нового объекта.
Каждому методу, полю, конструктору класса также соответствуют объекты, список которых можно получить вызовом соответствующих методов объекта Class: getMethods(), getFields(), getConstructors(), getDeclaredMethods() и т.д. В результате будут получены объекты, которые отвечают за поля, методы, конструкторы объекта. Их можно использовать для формирования динамических вызовов Java – этот механизм называется reflection . Необходимые классы содержатся в пакете java.lang.reflection.
Рассмотрим пример использования этой технологии:
package demo.lang; interface Vehicle { void go(); } class Automobile implements Vehicle { public void go() { System.out.println('Automobile go!'); } } class Truck implements Vehicle { public Truck(int i) { super(); } public void go() { System.out.println('Truck go!'); } } public class VehicleStarter { public static void main(String[] args) { Vehicle vehicle; String[] vehicleNames = {'demo.lang.Automobile', 'demo.lang.Truck', 'demo.lang.Tank'}; for(int i=0; i<vehicleNames.length; i++) { try { String name = vehicleNames[i]; System.out.println('look for class for: ' + name); Class aClass = Class.forName(name); System.out.println('creating vehicle...'); vehicle = (Vehicle)aClass.newInstance(); System.out.println('create vehicle: ' + vehicle.getClass()); vehicle.go(); } catch(ClassNotFoundException e) { System.out.println('Exception: ' + e); } catch(InstantiationException e) { System.out.println('Exception: ' + e); } } } } Пример 13.3.
Если запустить эту программу, на экран будет выведено следующее:
look for class for: demo.lang.Automobile creating vehicle... create vehicle: class demo.lang.Automobile Automobile go! look for class for: demo.lang.Truck creating vehicle... Exception: java.lang.InstantiationException look for class for: demo.lang.Tank Class not found: java.lang.ClassNotFoundException: demo.lang.Tank Пример 13.4.