Внутри объекта наследника содержится объект базового класса!!!, поэтому в конструктор производного класса автоматически вставляется вызов конструктора базового класса (наследника). Если конструкторов нет, компилятор генерирует конструктор по умолчанию, в котором тоже вызывается конструктор базового класса. Если у базового класса есть конструкторы только с аргументами, их нужно вызывать явно: super (…)
сlass Art {Art (){System.out.println (’’Art Constructor’’);}}
class Drawing extends Art {
Drawing (){System.out.println (’’Drawing Constructor’’);
}
public static void main (String [] args){
Drawing x = new Drawing ();
}
)
Напечатается: Art Constructor
Drawing Constructor
Конструирование происходит с самого внутреннего базового класса. Базовый класс конструируется первым.
Если конструкторы базового класса с аргументами
сlass Game {
Game (int i) {}
}
сlass BoargGame extends Game {
BoardGame (int i) {//конструктора по умолчанию в Game нет! Поэтому
super (i); //должен быть первой командой в конструкторе
}
}
public class Chess extends BoardGame{
Chess {
super (11);
}
public static void main (String []args){
Chess x= new Chess();
}
}
При загрузке загружается x.class, потом его базовый класс и т.д. Затем производится static инициализация: базовый и производные. Затем примитивные поля объектов – по умолчанию, а ссылки = null. Затем конструкторы базового класса. Затем инициализируются переменные. Затем -конструктор.
|
|
Делегирование
Вид композиции. Объект класса включается в новый класс и его методы делаются доступными.
Модуль управления:
public class SpaceShipControls{
void up (int velocity){}
void down (int velocity) {}
…
}
Корабль не есть наследник модуля управления (не проходит проверка is-а). Поэтому
public class SpaceShip{
private string name;
private SpaceShipControls controls = new SpaceShipControls();
public SpaceShip (String name){
this.name=name;
{
public void up (int velocity) {
controls.up (velocity);
}
public void down (int velocity) {
controls.down (int velocity)
}
...
main:
SpaceShip ship=new SpaceShip (“NASA”);
ship.up(100);
можем реализовать не все методы.