int i = 10; public Depend() { 
print();  
i = 20; 
} void print() { 
System.out.println("Depend=> " + i); 

}  class qdb extends Depend { 
int i = 30; public qdb() { 
print();  
super.print(); 
i = 40; 
} void print() { 
System.out.println("Target=> " + i); 

public static void main(String[] args) 

new qdb(); 
} 运行结果
Target=> 0//  能讲一下为什么这个为0么?
Target=> 30
Depend=> 20

解决方案 »

  1.   

    此回复为自动发出,仅用于显示而已,并无任何其他特殊作用
    楼主【david_0709】截止到2008-07-02 11:56:45的历史汇总数据(不包括此帖):
    发帖的总数量:0                        发帖的总分数:0                        
    结贴的总数量:0                        结贴的总分数:0                        
    无满意结贴数:0                        无满意结贴分:0                        
    未结的帖子数:0                        未结的总分数:0                        
    结贴的百分比:---------------------结分的百分比:---------------------
    无满意结贴率:---------------------无满意结分率:---------------------
    如何结贴请参考这里:http://topic.csdn.net/u/20080501/09/ef7ba1b3-6466-49f6-9d92-36fe6d471dd1.html
      

  2.   

    首先你要对对象实例化的过程有一个了解,生成一个子类对象,总是先生成其父类对象,直到生成了Object对象,此时各个类的成员变量都是根据默认值初始化的,然后从父类向子类完成各个成员变量的赋值操作。
    在new qdb()时,首先要生成Depend的实例,这时父类的i=10,然后调用父类的构造方法,执行print();  但是子类override了该方法,所以调用子类的print(),此时子类的i=0,还没有完成赋值,所以打印:Target=> 0
    接着父类改变自己i的值为20,完成父类构造方法的调用。
    接着子类完成本身i的赋值为30,然后调用自己的构造方法,打印Target=> 30
    最后通过super关键字访问父类的print方法,打印Depend=> 20
    最后修改自己i的值为40
      

  3.   

    我们顺着初始化的顺序来说
    首先程序从main方法开始执行,new Qdb(),这句话就是要new一个Qdb的对象,根据对象初始化的顺序,初始化子类之前必须要初始化父类,所以此时一系列的调用开始了
    1,调用Qdb的父类Depend类的构造函数,在调用构造函数之前,成员变量是先于构造函数初始化的,这个时候Depend里面的i已经有值了,它的值就是10,在Depend构造函数里面,我们看到的第一句是:print方法,这个print方法我们要注意,它在Depend的子类也定义了,并且此次初始化是由子类Qdb发起的,所以实际上这个print方法调用的是Qdb里面定义的print,而这个时候有意思的事情就出现了,此时子类还没有出生呢,因为这个时候父类才正在构造之中,所以子类中此时的i还是0,而print正好打印出的是子类的i,所以第一次输出是0;
    2,父类调用完子类的print后,把父类的i赋了值20,此时父类已经完全被构造出来了,马上就要开始构造子类了.
    3,同理,在调用子类的构造函数之前,子类的i被赋了初值30,然后进入子类的构造函数,此时调用的也是print,这个就非常好理解了,这个print肯定是子类自己的print方法了,此时i已经构造好,当然,此时输出的值是30;
    4,下一句super.print(),这句话显示的调用了父类的print方法,而此时父类的i已经在父类的构造函数里面改为20了,所以此次调用输出20.
    5,然后再把子类的i的值设为50.在以上过程中,如果掌握好了类的初始化顺序,是比较容易知道输出结果的.还有一点要记住,JAVA里面的方法是动态绑定的,而成员却是静态绑定的.父类里面调用的print之所以会输出0,就是因为print实际上调用的是子类的print,因为整个这场调用都是由new Qdb()这句话产生的.
      

  4.   

    对象在初始化时按以下顺序进行
    1,静态的类变量创建并赋值;
    2,非静态的类变量创建并初始化;
    3,执行父类constructor;
    4,非静态的类变量赋值;
    5,本类constructor中的其他语句;