抽象class和动态绑定

Abstract class and dynamic binding

所以我一直在研究抽象 classes 和动态绑定,并决定测试几个示例。

我有以下 3 个 classes:AbstractDemo(主要)、MyAbstract 和 MySubAbstract。主要方法是使用动态或静态绑定从两个 classes 调用方法。

以下所有调用都有效,但最后一个调用除外,在该调用中我尝试使用动态绑定并调用仅在 subclass (sub1()) 中定义的方法之一。我会假设尽管使用 superclass 的引用声明该对象仍然能够找到在该对象的 class.

中声明的方法

谁能解释一下为什么?

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();
  }
}

从您的代码 h 声明为 MyAbstract,因此如果没有显式转换,您只能访问 MyAbstract 中声明的方法(抽象方法和具体方法)。

要调用 sub1() 你需要施放它

MyAbstract h = new MySubAbstract(); 
((MySubAbstract) h).sub1();

MyAbstract h = new MySubAbstract(); h.sub1();

这将创建和对象 MySubAbstract 并将其存储在类型 MyAbstract 的引用中,这意味着您只能从 MyAbstract 调用方法,除非您强制转换它 ((MySubAbstract) h) .

polymorphism为例