class Super{ 
     int i=10; 
     Super(){ 
          print(); 
          i=20; 
     } 
     void print(){ 
         System.out.print(i); 
     } 

public class Sub extends Super{ 
     int j=30; 
     Sub(){ 
          print(); 
         j=40; 
     } 
     void print(){ 
          System.out.print(j); 
     } 
     public static void main(String[] args){ 
          System.out.print(new Sub().j); 
     } 

解决方案 »

  1.   

    参考一下:
    http://topic.csdn.net/u/20120730/01/ed1ffbf6-44bd-422d-a530-75c908590a17.html
      

  2.   

    1. 父类 构造器
    2. 子类 print 方法
    3. 子类 i = 0 赋值
    4. 子类 构造器
    5. 子类 print 方法
    6. 子类 i = 30
    7. main 输出 40
      

  3.   

    运行了下代码,输出结果:

    30
    40new Sub().j
    调用该new 方法,会先去调用父类的构造方法。接着就初始化父类中的成员变量,将i赋值为10.
    然后进入父类方法中的print()方法。然而因为是子类中也有该方法,父类中的该方法被隐藏。
    但是此时子类中的成员变量还没有被赋值成30.所以子类中的i为初始值0.-->第一个打印的数0就是这么出来的。接着回到子类自己的构造方法中,i被赋值为30.然后再调用print()方法。输出30. 接着再被赋值成40.
    最后一个40是main方法里打印处理的。
      

  4.   

    看一下这个帖子,讲的是JAVA中继承关系的初始化顺序,可能会对你有帮助
    http://blog.csdn.net/ada168855/article/details/7774562
      

  5.   

    0和30都是调用Sub类的print方法的,最后一个40没什么好说的
      

  6.   

    sub类继承super类,重写print方法。
    在new Sub类时要先初始化父类成员变量和调用父类构造方法:
      super类的构造方法中的print方法调用的是子类重写后的print方法,此时成员变量j还未初始化,默认j=0;
      回到子类,初始化子类j=30,然后调用子类的构造方法中的print方法,j=30;最后打印40