抽象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为例
所以我一直在研究抽象 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为例