因此,我一直在研究抽象类和动态绑定,并决定测试一些示例。
我有以下3个类:AbstractDemo(主要),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();
}
}
最佳答案
MyAbstract h =新的MySubAbstract(); h.sub1();
这将创建并反对MySubAbstract
并将其存储在类型为MyAbstract
的引用中,这意味着除非将其强制转换为MyAbstract
,否则您只能从((MySubAbstract) h)
调用方法。
参见polymorphism作为示例