动态绑定机制是多态的根源,这里的动态绑定机制应该怎么理解?
public class test {
private void print(){
System.out.println("A");
}
public static void main(String[] args) {
new test().print();
test b = new B();
b.print(); // A
test c = new C();
c.print(); // A
new C().print();
test d = new D();
d.print(); // A
}
}
class B extends test{
private void print(){
System.out.println("B");
}
}
class C extends test{
public void print(){
System.out.println("C");
}
}
class D extends test{
public static void print(){
System.out.println("D");
}
}
之前的代码有点问题,其实就是想问在 public 类里写一个私有方法为什么它的子类都会访问到这个方法
因为c是A的引用,C的实例。
A类中有print方法,所以调用的是A类中的方法。
我想你发的代码不是你想要的结果,个人理解动态绑定指的是变量与实际的对象类型绑定是动态的,比如我下面print变量先后绑定的对象类型分别是A和B,当绑定的对象类型不同时,调用同样的方法可以执行不同的逻辑。自己多看多想多试自然就明白了
public class Main {
public static void main(String[] args) {
PrintAble print = new A();
print.print();
print = new B();
print.print();
}
}
interface PrintAble {
void print();
}
class A implements PrintAble {
@Override
public void print() {
System.out.println("A");
}
}
class B implements PrintAble {
@Override
public void print() {
System.out.println("B");
}
}
补个回答,这个单纯就是向上转型和动态绑定的概念搞混了,test在这里既是父类也是子类,因为 print() 方法是私有的,所以子类的 print() 方法不算重写,向上转型后,引用是指向父类的空间的,也就是编译阶段是根据父类的方法来执行,不能执行子类特有的方法,一般父类的private方法向上转型后也是用不了的,但是这里父类也是主类,所以在这里能够执行那个父类的 private 方法
我不知道你这个代码哪儿来的,也不知道你有没有实际运行过。A b = new B();
这里会报错,B与A不是继承关系。就算有继承关系,new B().print()也会输出B
。c.print()
也输出的是C
。