#java #inheritance #casting #multiple-inheritance #downcast
#java #наследование #Кастинг #множественное наследование #понижение
Вопрос:
public class A
{
public void printA(){
System.out.println("A");
}
}
public class B extends A
{
public void printB(){
System.out.println("B");
}
}
public class C extends B
{
public void printC(){
System.out.println("C");
}
}
public class test {
public static void main(String[] args)
{
A a = new B();
a.printA(); // work
B b = (B) a;
b.printB(); // work
C c = (C) b;
c.printC(); // not work throw java.lang.ClassCastException
}
}
у меня есть три класса A, B и C
C простирается от B, а B простирается от A
почему приведение вниз работает от A до B и не работает от B до C, хотя связь между ними, как A и B, B является родительской для C, так как это работает JVM??
Комментарии:
1. Вы не можете изменить класс объекта, вы можете изменить только класс ссылки.
2. я не понимаю, где я пытаюсь изменить класс объекта в своем коде??
3. Когда вы это делаете
(C) b
, вы пытаетесь притвориться, что это изменяет тип объекта на aC
, но это не так. Тип объекта всегда aB
.4. но B является родительским для C, это правда? итак, C — это instanceof B, и я могу выполнить приведение!!
5. Это уже объясняется во многих местах в Интернете. При всем уважении к stackoverflowers, я сомневаюсь, что все, что будет написано в этом потоке, будет понятнее, чем то, что уже есть. Пожалуйста, проведите свое исследование и изучите ресурсы.
Ответ №1:
Классы могут быть приведены только к их родительским классам, они ничего не знают о своих подклассах.
Поскольку ваш объект является экземпляром B
, он не реализует методы C
.
Это будет работать:
A a = new C();
a.printA(); // work
B b = (B) a;
b.printB(); // work
C c = (C) b;
c.printC(); // work
Комментарии:
1. Вы можете привести класс только к его родительскому, но не к его дочернему. Потому что класс ничего не знает о под-классах.