日期:2014-05-20  浏览次数:20865 次

能否详细解释为什么打印的是A,而不是B
class A{
private void fun(){
System.out.println("A");

public void f(){
this.fun();

}
}
class B extends A{
public void fun(){
System.out.println("B");
}
}

public class TestOverride {

public static void main(String[] args) {
B b = new B();
b.f();

}

}


------解决方案--------------------
父类中的private方法和域是不被继承的。
那么此时的子类B中所具有的方法有:A.f(),B.fun()这两个。
而当你实例化B后调用f()函数,而f()里又调用了fun();
但此时编译器知道fun()是private的,
那么他直接静态绑定了父类中的fun()方法。
此时并不存在多态问题
------解决方案--------------------
探讨

父类中的private方法和域是不被继承的。
那么此时的子类B中所具有的方法有:A.f(),B.fun()这两个。
而当你实例化B后调用f()函数,而f()里又调用了fun();
但此时编译器知道fun()是private的,
那么他直接静态绑定了父类中的fun()方法。
此时并不存在多态问题

------解决方案--------------------
java中的变量是静态绑定的,方法的话只有static和final(所有private默认是final的)是静态绑定的. 
你所说的 父类中的this 是指 子类的引用(可以打印试试,属于动态绑定,在运行是查找执行),此处是private,所以属于静态绑定,
我感觉你只考虑到了多态,但没有考虑到静态绑定。。。。所以疑惑,,个人的见解,供你参考!!!!