请写出输出结果:
public class testA 
{
testA ()
{
System.out.println("P");
init();
}
void init()
{
System.out.println("Q"); 
}
public static void main(String[] args) 
{
new testB();
}
}class testB extends testA
{
int i=1;
testB(){
super();
System.out.println(i+" ");
}
void init(){
i = 2;
}
};正确输出结果为:
P
1
后来我发现,如果将testA中的void init()改成 private void init(),则结果为:
P
Q
1
我调试了一下,发现没有private时的流程是:
new testB() -> testB()中的super() -> testA()中输出P -> 调用println("P")后面的init() (注:此时没有进入testA()中的void init(),而是进入了testB()中的init()) -> 进入testB()中init()函数里i=2 -> 退出testA构造函数,进入testB()中 int i=1处 -> 输出i
这是什么原因呢?请大家积极发言,共同探讨一下……

解决方案 »

  1.   

    private void init(),这个是私有的,私有的方法不能够被继承,,此时将会调用子类自己的同名方法。。所以就会出现你说的情况该为public应该就不会了
      

  2.   

    个人认为是子类覆盖了父类的void init()方法。
      

  3.   

    在构造testB类对象前,必须要先构造testA类实例,即使你不通过super关键字调用testA类的构造方法。init()函数在testA中被覆写了,testA的构造方法调用init()方法时实际上调用的是testB中的init(),在方法体中i被改变了,但出了这个方法体i的值还是1,这实际上就是多态性的体现。如果把init()方法声明成private了,testB中的init()方法就不是覆写了。
      

  4.   

    写成private,则testB类没有重写父类方法,所以会打印Q了。没写就是重写了,就没打印了
      

  5.   

    有个笔误,init()函数在testB中被覆写了
      

  6.   

    这个应该是动态绑定和静态绑定的事情吧~
    正常的话java中所有的方法都是动态绑定的~testA 中private void test()不能动态绑定,静态绑定?
      

  7.   

    这样,基类中的init方法被子类覆盖,new一个testB的对象会调用testB中的init方法;而改为private之后,testB不能覆盖init方法,故调用构造方法时调用的是testA中的init方法,会输出Q
      

  8.   

    恩啊,privat不方法不会被子类覆写。所以调用的是自己的方法,如果不加public调用的是子类的方法。