public class Test 
{
public static void main(String[] args)
{
A aa=new A();
aa.print();

B bb=new B();
bb.print();

}
}
class A
{
public void print()
{
print2();
System.out.println(i);
}
public void print2()
{
System.out.println("AAAA");
}
public int i=10;
}class B extends A
{
public void print2()
{
System.out.println("BBBB");

}

public int i=15;
}
此函数输出结果为: 
AAAA
10
BBBB
10那么我的问题就是:当子类B的实例去调用从父类A继承来的函数print()时,print()里再去调用了在B类中覆盖的print2()和覆盖的实例域. 发现print()函数调用了类B的函数print2(),和读取类A的实例域i.为什么它不调用类A的函数print2()和读取A的实例域,或者调用类B的函数print2()和读取B的实例域呢?而是选择调用函数时调用子类的,读取实例域读取父类的?

解决方案 »

  1.   

    B继承了A,同时覆盖了A的print2方法,但是没有覆盖掉A的print方法,那么当调用B实例方法print时,会将A print方法中的print2给换成B中的print2方法而打印语句没有变化,所以就有那个结果了
      

  2.   

    其实,print2()和i前面都有个隐性参数this,但为什么this.print2()里的this是类B的实例,而this.i里的this是类A的实例?