首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

能否详细解释为什么打印的是A,而不是B解决思路

2012-04-21 
能否详细解释为什么打印的是A,而不是Bclass A{private void fun(){System.out.println(A)}public void

能否详细解释为什么打印的是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,所以属于静态绑定,
我感觉你只考虑到了多态,但没有考虑到静态绑定。。。。所以疑惑,,个人的见解,供你参考!!!!

热点排行