И композиция и наследование – встраивание подобъекта внутрь нового класса.
Композиция использует функциональность, возможности существующего класса и не использует интерфейс. Т.е. клиент видит интерфейс нового класса и не видит встроенных объектов (используется реализация, а не интерфейс).
При наследовании виден интерфейс встроенного объекта. Иногда открывают доступ к интерфейсу и при композиции. Моделируем автомобиль (Car)
class Engine { public void start (){}…}
class Wheel { public void inflate (int psi){}…}
class Window { public void rollup (){}…}
class Door { public Window window = new Window ();
public void open {}…}
public class Car {
public Engine engine = new Engine ();
public Wheel[] wheel = new Wheel [4];
public Door left = new Door (),
right = new Door ();
public Car (){ for (int i=0; i<4; i++)
wheel [i] = new Wheel ();
}
public static void main (String[]args) {
Car car = new Car ();
car.left.window.rollup();
car.wheel [0].inflame (72);
}
}
Если строится иерархия Машина – Средство передвижения -нужно применять наследование..
System.out.println ()- пример композиции с статическим полем-открытым объектом out класса PrintStream
Восходящее преобразование типов (upcasting)
Наследник имеет тип базового класса. Любое сообщение, которое можно отправить базовому классу, можно отправить и производному (все не приватные методы базового доступны в производном).
class Instrument {
public void play ();
static void tune (Instrument i) {
i.play ();
}
}
public class Wind extends Instrument {
public static void main (String [] args) {
Wind flute = new Wind ();
Instrument.tune (flute);
}
}
flute тоже имеет метод play();
В методе tune код работает для Insrtument и любых объектов, производных от Insrtument.
Наследование, как правило, применяется, если нужен upcasting. Если нет -композиция.
Ключевое слово final
Может применяться для:
1) для примитивных типов – делает их const – ой.
static final – это константа, которая хранится в памяти в единственном экземпляре и не может быть изменена;
2) для ссылок – постоянной будет ссылка (не может указывать на другой объект). Объект может изменяться.
3) Могут быть неизменные аргументы метода.
int g(final int i){return i++;}-нельзя,это ошибка
4) final - метод (нельзя переопределить), final – класс (нельзя наследовать).