Итак, я изучал абстрактные классы и динамическое связывание и решил проверить несколько примеров.Аннотация класс и динамическое связывание
У меня есть следующие 3 класса: AbstractDemo (main), MyAbstract и MySubAbstract. Основным методом является вызов методов из обоих классов с использованием динамического или статического привязки.
Все следующие вызовы работают, за исключением последнего, где я пытаюсь использовать динамическое связывание, и вызывать один из методов, определенных только в подклассе (sub1()). Я бы предположил, что, несмотря на то, что был объявлен ссылкой на суперкласс, объект все равно сможет найти метод, объявленный в классе этого объекта.
Может кто-нибудь объяснить, почему?
public abstract class MyAbstract {
public abstract void abs1();
public abstract void abs2();
public void nonAbs1() {
System.out.println("MyAbstract nonAbs1");
}
public void nonAbs2() {
System.out.println("MyAbstract nonAbs2");
}
}
public class MySubAbstract extends MyAbstract {
public void abs1() {
System.out.println("MySubAbstract abs1()");
}
public void abs2() {
System.out.println("MySubAbstract abs2()");
}
public void sub1() {
System.out.println("MySubAbstract sub1()");
}
public void sub2() {
System.out.println("MySubAbstract sub2()");
}
public void nonAbs1() {
System.out.println("MySubAbstract nonAbs1()");
}
}
public class AbstractDemo {
public static void main(String[] args) {
MySubAbstract a = new MySubAbstract(); a.abs1();
MySubAbstract b = new MySubAbstract(); b.sub1();
MySubAbstract c = new MySubAbstract(); c.nonAbs2();
MySubAbstract d = new MySubAbstract(); d.nonAbs1();
MySubAbstract e = new MySubAbstract(); e.nonAbs2();
MyAbstract f = new MySubAbstract(); f.abs1();
MyAbstract g = new MySubAbstract(); g.nonAbs1();
MyAbstract h = new MySubAbstract(); h.sub1();
}
}
Возможный дубликат [Вызов метода класса ребенка от родительского объекта класса] (http://stackoverflow.com/questions/11466441/call-a-child-class-method-from -a-parent-class-object) –