Spec-Zone .ru
спецификации, руководства, описания, API
След: Изучение Языка Java
Урок: Интерфейсы и Наследование
Наследование
Домашняя страница > Изучение Языка Java > Интерфейсы и Наследование

Наследование

В предыдущих уроках Вы видели наследование, упомянутое несколько раз. На языке Java классы могут быть получены из других классов, таким образом наследовав поля и методы от тех классов.


Определения: class, который получается из другого class, вызывают подклассом (также полученный class, расширял class, или дочерний class). class, из которого получается подкласс, вызывают суперклассом (также основной class или родительский class).

За исключением Object, у которого нет никакого суперкласса, у каждого class есть один и только один прямой суперкласс (единичное наследование). В отсутствие любого другого явного суперкласса каждый class является неявно подклассом Object.

Классы могут быть получены из классов, которые получаются из классов, которые получаются из классов, и так далее, и в конечном счете получаются из самого верхнего class, Object. Такой class, как говорят, происходит от всех классов в цепочке наследования протяжение назад к Object.

Идея наследования проста, но мощна: Когда Вы хотите создать новый class и уже есть class, который включает часть кода, который Вы хотите, можно получить свой новый class из существующего class. В выполнении этого можно снова использовать поля и методы существующего class, не имея необходимость писать (и отладка!) их непосредственно.

Подкласс наследовал все элементы (поля, методы, и вложенные классы) от его суперкласса. Конструкторы не являются элементами, таким образом, они не наследованы подклассами, но конструктор суперкласса может быть вызван от подкласса.

Иерархия классов Платформы Java

Object class, определенный в java.lang пакет, определяет и реализует поведение, характерное для всех классов — включая тех, что Вы пишете. В платформе Java много классов происходят непосредственно из Object, другие классы происходят из некоторых из тех классов, и так далее, формируя иерархию классов.

Все Классы в Платформе Java являются Потомками Объекта

Все Классы в Платформе Java являются Потомками Объекта

Наверху иерархии, Object является самым общим из всех классов. Классы около нижней части иерархии обеспечивают более специализированное поведение.

Пример Наследования

Вот пример кода для возможной реализации a Bicycle class, который был представлен в уроке Классов и Объектов:

public class Bicycle {
        
    // the Bicycle class has
    // three fields
    public int cadence;
    public int gear;
    public int speed;
        
    // the Bicycle class has
    // one constructor
    public Bicycle(int startCadence, int startSpeed, int startGear) {
        gear = startGear;
        cadence = startCadence;
        speed = startSpeed;
    }
        
    // the Bicycle class has
    // four methods
    public void setCadence(int newValue) {
        cadence = newValue;
    }
        
    public void setGear(int newValue) {
        gear = newValue;
    }
        
    public void applyBrake(int decrement) {
        speed -= decrement;
    }
        
    public void speedUp(int increment) {
        speed += increment;
    }
        
}

Объявление class для a MountainBike class, который является подклассом Bicycle мог бы быть похожим на это:

public class MountainBike extends Bicycle {
        
    // the MountainBike subclass adds
    // one field
    public int seatHeight;

    // the MountainBike subclass has one
    // constructor
    public MountainBike(int startHeight,
                        int startCadence,
                        int startSpeed,
                        int startGear) {
        super(startCadence, startSpeed, startGear);
        seatHeight = startHeight;
    }   
        
    // the MountainBike subclass adds
    // one method
    public void setHeight(int newValue) {
        seatHeight = newValue;
    }   
}

MountainBike наследовал все поля и методы Bicycle и добавляет поле seatHeight и метод, чтобы установить это. За исключением конструктора, это - как будто Вы записали новое MountainBike class полностью с нуля, с четырьмя полями и пятью методами. Однако, Вы не должны были сделать всей работы. Это было бы особенно ценно если методы в Bicycle class был сложен и занял время, чтобы отладить.

Что Можно Сделать в Подклассе

Подкласс наследовал все общедоступные и защищенные элементы его родителя, независимо от того в каком пакете подкласс находится. Если подкласс находится в том же самом пакете как его родитель, это также наследовало членов парламента, не занимающих официального поста пакета родителя. Можно использовать наследованные элементы как есть, заменить их, скрыть их, или добавить их с новыми элементами:

Следующие разделы в этом уроке подробно остановятся на этих темах.

Члены парламента, не занимающие официального поста в Суперклассе

Подкласс не наследовался private элементы его родительского class. Однако, если у суперкласса есть общедоступные или защищенные методы для того, чтобы получить доступ к его частным полям, они могут также использоваться подклассом.

У вложенного class есть доступ ко всем членам парламента, не занимающим официального поста его включения class — и поля и методы. Поэтому, общественность или защищенный вкладывала class, наследованный подклассом, имеет косвенный доступ ко всем членам парламента, не занимающим официального поста суперкласса.

Кастинг Объектов

Мы видели, что объект имеет тип данных class, от которого это инстанцировали. Например, если мы пишем

public MountainBike myBike = new MountainBike();

тогда myBike имеет тип MountainBike.

MountainBike происходит от Bicycle и Object. Поэтому, a MountainBike a Bicycle и также Object, и это может использоваться везде, где Bicycle или Object объекты требуются.

Реверс не обязательно истинен: a Bicycle может быть a MountainBike, но это не обязательно. Точно так же Object может быть a Bicycle или a MountainBike, но это не обязательно.

Кастинг показывает использование объекта одного типа вместо другого типа среди объектов, разрешенных наследованием и реализациями. Например, если мы пишем

Object obj = new MountainBike();

тогда obj оба Object и a Mountainbike (до тех пор, пока obj присваивается другой объект, который не является a Mountainbike). Это вызывают неявным кастингом.

Если с другой стороны пишем мы

MountainBike myBike = obj;

мы получили бы ошибку времени компиляции потому что obj как известно, компилятору не a MountainBike. Однако, мы можем сказать компилятору, что обещаем присвоить a MountainBike к obj явным кастингом:

MountainBike myBike = (MountainBike)obj;

Этот бросок вставляет проверку на этапе выполнения это obj присваивается a MountainBike так, чтобы компилятор мог безопасно принять это obj a MountainBike. Если obj не a Mountainbike во времени выполнения будет выдано исключение.


Отметьте: можно сделать логический тест относительно типа определенного объекта, используя instanceof оператор. Это может спасти Вас от ошибки периода выполнения вследствие неподходящего броска. Например:
if (obj instanceof MountainBike) {
    MountainBike myBike = (MountainBike)obj;
}

Здесь instanceof оператор проверяет это obj обращается к a MountainBike так, чтобы мы могли сделать бросок со знанием, что не будет никакого брошенного исключения на этапе выполнения.



Проблемы с примерами? Попытайтесь Компилировать и Выполнить Примеры: FAQ.
Жалобы? Поздравление? Предложения? Дайте нам свою обратную связь.

Предыдущая страница: Вопросы и Упражнения: Интерфейсы
Следующая страница: Переопределение и Сокрытие Методов