Можно ли создать подкласс, который выходит из другого подкласса? - PullRequest
0 голосов
/ 02 февраля 2019

Я все еще учусь кодировать Java, и у меня возник вопрос о том, как работает наследование.Класс A является родительским классом, а класс B является подклассом, который наследует все методы из класса A. Предположим, я создаю третий класс, класс C. Если я делаю, класс C расширяет класс B, это отличается от того, что делает класс C, расширяет класс A?Если так, то как?Благодарю вас.(Извините, если формат отстой)

1 Ответ

0 голосов
/ 02 февраля 2019

Самый простой способ визуализировать это состоит в том, чтобы учесть, что наследование похоже на отношения родитель / потомок.Вы можете иметь Parent -> Child -> Grand Child и т. Д.

Когда у вас есть:

class A {}
class B extends A{}
class C extends B{}

C, это как внучатый ребенок A.А это значит, что C наследует все методы от B, включая те методы, которые B сам унаследовал от A. In OOP words, C **is** A`.

Однако, когда у вас есть

class A {}
class B extends A{}
class C extends A{}

C и B являются классами sibling , то есть оба они наследуют методы A, но они несовместимы друг с другом.


В первом случае они действительны:

C c = new C();
c.methodFromA(); //C inherits methods from A by being its grand-child
c.methodFromB(); //C inherits methods from B by being its child
c.methodFromC();

Во втором случае, однако, когда оба B и C extends A напрямую:

C c = new C();
B b = new B();
c.methodFromA(); //C inherits methods from A by being its child
b.methodFromA(); //B inherits methods from A by being its child

c.methodFromB(); //not allowed
b.methodFromC(); //not allowed

Однако прямой связи между B и C нет.Это неверно:

B b = new B();
C c = new C();

b = (B) c; //invalid, won't compile

A b = b;
c = (C) b; //will compile, but cause a ClassCastException at runtime
...