Spec-Zone .ru
спецификации, руководства, описания, API
|
В предыдущих уроках Вы видели наследование, упомянутое несколько раз. На языке Java классы могут быть получены из других классов, таким образом наследовав поля и методы от тех классов.
Object
, у которого нет никакого суперкласса, у каждого class есть один и только один прямой суперкласс (единичное наследование). В отсутствие любого другого явного суперкласса каждый class является неявно подклассом Object
.Object
. Такой class, как говорят, происходит от всех классов в цепочке наследования протяжение назад к Object
. Идея наследования проста, но мощна: Когда Вы хотите создать новый class и уже есть class, который включает часть кода, который Вы хотите, можно получить свой новый class из существующего class. В выполнении этого можно снова использовать поля и методы существующего class, не имея необходимость писать (и отладка!) их непосредственно.
Подкласс наследовал все элементы (поля, методы, и вложенные классы) от его суперкласса. Конструкторы не являются элементами, таким образом, они не наследованы подклассами, но конструктор суперкласса может быть вызван от подкласса.
Object
class, определенный в java.lang
пакет, определяет и реализует поведение, характерное для всех классов — включая тех, что Вы пишете. В платформе Java много классов происходят непосредственно из Object
, другие классы происходят из некоторых из тех классов, и так далее, формируя иерархию классов.
Все Классы в Платформе 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 был сложен и занял время, чтобы отладить.
Подкласс наследовал все общедоступные и защищенные элементы его родителя, независимо от того в каком пакете подкласс находится. Если подкласс находится в том же самом пакете как его родитель, это также наследовало членов парламента, не занимающих официального поста пакета родителя. Можно использовать наследованные элементы как есть, заменить их, скрыть их, или добавить их с новыми элементами:
super
.Следующие разделы в этом уроке подробно остановятся на этих темах.
Подкласс не наследовался 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
так, чтобы мы могли сделать бросок со знанием, что не будет никакого брошенного исключения на этапе выполнения.