одной - отсутствующей. В языке Java не бывает деструкторов.
Причина в том, что управление памятью автоматизировано (в фоно-
вом режиме работает сборщик мусора). Для высвобождения прочих
ресурсов, ассоциированных с об®ектом, служит специальный метод
finalize. Этот метод вызывается сборщиком мусора в момент ути-
лизации памяти, занимавшейся об®ектом.
Ключевое слово this (см., например, строки 5 и 9) используется
для ссылки на самого себя. Аналогичную роль по отношению к ро-
дительскому классу играет слово super:
1 class ThreePoint extends Point {
2 protected double z;
3 ThreePoint () {
4 super ();
5 z = 0.0;
6 }
7 ThreePoint (double x, double y, double z) {
8 super (x, y);
9 this.z = z;
10 }
11 }
В строках 4 и 8 вызываются конструкторы родительского класса.
Приведенные примеры показывают, что в языке Java, как и C++,
методы могут быть перегруженными, то есть под одним именем мо-
гут фигурировать разные методы с разным набором параметров.
Как и C++, с помщью ключевого слова static можно определить
данные и методы, которые являются общими для всех об®ектов
класса. (Отметим попутно, что функций, не принадлежащих какому-
либо классу, в языке Java не бывает.) Следующий пример содержит
фрагменты стандартного пакета java.lang.
1 public final
2 class Character extends Object {
3 public static final int MAX_ъADIX = 36;
4 static char downCase[];
5 static {
6 char down[] = new char[256];
7 for (int i = 0 ; i < 256 ; i++) {
8 down[i] = (char) i;
9 }
10 for (int lower = 'a' ; lower <= 'z' ; lower++) {
11 int upper = (lower + ('A' - 'a'));
12 down[upper] = (char)lower;
13 }
14 for (int lower = 0xE0; lower <= 0xFE; lower++) {
15 if (lower != 0xF7) { // multiply and divide
16 int upper = (lower + ('A' - 'a'));
17 down[upper] = (char)lower;
18 }
19 }
20 downCase = down;
21 }
22 public static boolean isLowerCase(char ch) {
23 return (upCase[ch] != ch);
24 }
25 }
Прокомментируем этот пример с точки зрения отличий Java от C++.
Строки с 5 по 21 представляют собой инициализацию статических
данных класса, которая осуществляется в момент загрузки класса
в Java-машину. По сути этот код играет роль конструктора класса
Character.
В строках 1 и 3 встречается ключевое слово final. В строке 1
это слово обозначает запрет на наследование от класса
Character. В строке 3 его смысл аналогичен описателю const в
C++.
Если слово final использовано в заголовке метода, то данный ме-
тод не может быть переопределен в классах-наследниках.
Как и в C++, в языке Java классы могут быть абстрактными, то
есть не до конца конкретизированными. Это означает, что в клас-
се описаны методы, определения которых отсутствуют. Такие мето-
ды (как и сам класс) должны снабжаться описателем abstract.
Абстрактные методы должны конкретизироваться в производных
классах.
В языке Java имеется предопределенная иерархия классов, содер-
жащихся в пакете java.lang. На рис. 9 эта иерархия представлена
графически.
Рис. 9. Иерархия предопределенных классов языка Java.
В этой иерархии несколько особняком стоит класс Class. Програм-
мист не может создать об®ект класса Class (правда, существуют и
другие классы с этим свойством). Ссылки на об®кт класса Class
можно получить с помощью метода getClass, определенного для об-
®ектов класса Object.
Об®екты класса Class используются для получения во время выпол-
нение информации о "классовых" свойствах об®екта. К об®ектам
класса Class, помимо прочих, применимы следующие методы:
1 public native String getName();
2 public native Class getSuperclass();
3 public static native Class forName(String className)
throws ClassNotFoundException;
Метод forName позволяет получить ссылку на класс по его имени.
Описатель native свидетельствует о том, что метод реализуется
средствами, внешними по отношению к Java-системе (например, пи-
шется на языке C).
4.1.1.2. Наследование
Модель наследования в языке Java существенно отличается от мо-
дели C++. Во-первых, в Java нет множественного наследования.
Во-вторых, в языке предусмотрены средства для запрета дальней-
шего наследования (ключевое слово final перед определением
класса). В-третьих, в языке Java присутствует новое по отноше-
нию к C++ понятие интерфейса.
Интерфейс представляет собой набор описаний методов. Пример:
public interface Verbose {
public void drawOn (Graphics g);
public void printOn (OutputStream os);
}
public class Star extends Polygon implements Verbose {
public void drawOn (Graphics g) {
// Конкретная реализация отрисовки
}
public void printOn (OutputStream os) {
// Конкретная реализация печати
}
}
public class Text extends StringBuffer implements Verbose {
public void drawOn (Graphics g) {
// Конкретная реализация отрисовки
}
public void printOn (OutputStream os) {
// Конкретная реализация печати
}
}
public class Blackboard extends Canvas {
Читать дальше