因此,我一直在研究抽象类和动态绑定,并决定测试一些示例。

我有以下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作为示例

09-12 16:10