Java руководство для начинающих - Шилдт Герберт (2012)
-
Год:2012
-
Название:Java руководство для начинающих
-
Автор:
-
Жанр:
-
Оригинал:Английский
-
Язык:Русский
-
Издательство:Вильямс
-
Страниц:316
-
ISBN:978-5-8459-1770-6
-
Рейтинг:
-
Ваша оценка:
Java руководство для начинающих - Шилдт Герберт читать онлайн бесплатно полную версию книги
// создать суперкласс
class А {
А() {
System.out.println("Constructing A.") ;
}
}
// создать подкласс путем расширения класса А
class В extends А {
ВО {
System.out.println("Constructing В.");
}
}
// создать подкласс путем расширения класса В
class С extends В {
СО {
System.out.println("Constructing С.") ;
}
}
class OrderOfConstruction {
public static void main(String args[]) {
С с = new С();
}
}
Ниже приведен результат выполнения данной программы.
Constructing А.
Constructing В.
Constructing С.
Как видите, конструкторы вызываются по порядку выведения их классов.
По зрелом размышлении можно прийти к выводу, что вызов конструкторов по порядку выведения их классов имеет определенный смысл. Ведь суперклассу ничего не известно ни об одном из производных от него подклассов, и поэтому любая инициализация, которая требуется его членам, осуществляется совершенно отдельно от инициализации членов подкласса, а возможно, это и необходимое условие. Следовательно, онадолжна выполняться первой.
Ссылки на суперкласс и объекты подклассов
Как вам должно быть уже известно, Java является строго типизированным языком программирования. Помимо стандартных преобразований и автоматического продвижения простых типов данных, в этом языке строго соблюдается принцип совместимости типов. Это означает, что переменная ссылки на объект класса одного типа, как правило, не может ссылаться на объект класса другого типа. В качестве примера рассмотрим следующую простую программу:
// Этот код не подлежит компиляции,
class X {
int а;
X(int i) { а = i; }
}
class Y {
int a;
Y(int i) { a = i; }
}
class IncompatibleRef {
public static void main(String args[]) {
X x = new X(10);
X x2;
Y у = new Y(5);
x2 = x; // Допустимо, так как обе переменные одного типа.
х2 = у; // Ошибка, так как переменные разных типов.
}
}
Несмотря на то что классы X и Y содержат одинаковые члены, переменной типа X нельзя присвоить ссылку на объект типа Y, поскольку типы объектов отличаются. Вообще говоря, переменная ссылки на объект может указывать только на объекты своего типа.
Но из этого строгого правила соблюдения типов имеется следующее важное исключение: переменной ссылки на объект суперкласса может быть присвоена ссылка на объект любого производного от него подкласса. Следовательно, по ссылке на объект суперкласса можно обращаться к объекту подкласса. Ниже приведен соответствующий пример.
// Обращение к объекту подкласса по ссылке на объект суперкласса,
class X {
int а;
X(int i) { а = i; }
}
class Y extends X {
int b;
Y(int i, int j) {
super(j) ;
b = i;
}
}
class SupSubRef {
public static void main(String args[]) {
X x = new X(10);
X x2;
Y у = new Y(5, 6) ;
x2 = x; // Допустимо, так как обе переменные одного типа.
System.out.println("х2.а: " + х2.а);
// Класс Y является подклассом X, поэтому переменные х2 и у 1
// могут ссылаться на один и тот же объект производного класса.
х2 = у; // По-прежнему допустимо по указанной выше причине.
System.out.println("х2.а: " + х2.а);
// В классе X известны только члены класса X.
х2.а = 19; // Допустимо.
//х2.b=27; // Ошибка, так как переменная Ь не является членом класса X.
}
}
В данном примере класс Y является подклассом X. Следовательно, переменной х2 можно присвоить ссылку на объект типа Y.