class Cat extends Super{
 int j=30; 
 Cat(){
 print();
 j=40;
 }
 void print(){
 System.out.println(j);
 }
 public static void main(String[] args) {
 System.out.println(new Cat().j);
}
 }
 class Super{
 int i=10;
 Super(){
 print();
 
 i=20;
 }
 void print(){
 System.out.println(i);
 }
 }执行过程 麻烦帮我分析一下 为啥是
0
30
40

解决方案 »

  1.   

    class Cat extends Super{//继承
    int j=30;  
    Cat(){//子类重写构造器
    print();//调用子类的print方法
    j=40;//赋值,j为40
    }
    void print(){//输出j
    System.out.println(j);
    }
    public static void main(String[] args) {//首先被执行
    System.out.println(new Cat().j);//先调用父类的构造器来初始化,此时,父类中的变量i没被初始化//值为0,首先被父类的print函数输出,然后就是子类的构造器,此时,j已经初始化为30,打印出后,变为//40,再次被System.out.println输出;

    }
     }
     class Super{
    int i=10;//没被初始化i=0
    Super(){
    print();
      
    i=20;
    }
    void print(){
    System.out.println(i);
    }
     }
      

  2.   

    System.out.println(new Cat().j);
    1、调用Cat 构造
    2、调用父类Super 构造
    3、调用print方法,因为子类重写了这个方法,所以这时候是调的子类Cat的print方法。而子类Cat还未初始化(注意是先从父类开始初始化,这时候还未到子类),所以j是0
    4、给属性i赋值
    5、回到子类Cat,初始化j=30
    6、调print方法,打印的是30
    7、给j赋值为40
    8、cat.j = 40
      

  3.   

    +1
    调用父类构造方法是,调用的是print是子类重写过的方法,打印的是j的值,并不是i的值
      

  4.   


    问下,默认调用的无参数构造方法,我想问的是父类中没有j这个变量,为什么父类能对j初始化,j=0?
      

  5.   

    因为在new Cat()的时候,先调用执行其父类的初始话工作,这个时候子类的属性都还未初始话,所以都是默认值(类的属性都会有默认值的,int类型数据的默认值为0),所以这个时候调用print方法的时候打印出来的是j的默认值0,父类初始化结束后,在初始化子类,这个时候j的值就是30了,所以调用print方法的时候打的是30
      

  6.   

    "调用父类构造方法是,调用的是print是子类重写过的方法,打印的是j的值,并不是i的值"
    收益了!
      

  7.   

    new Cat(),在内存中开新开辟一段内存,刚好能那个装下Cat的实例,这段内存既有Cat本省定义的j,也有从父类继承来的i;在刚开始分配内存的时候,还没哟往内存里面填数据,所有变量都使0.然后在开始处理父类定义的类变量赋值语句.奔例是int i=30,将i占用的那4个字节的内容修改为10.日阿后在调用父类的构造函数.然后再始处理本类定义的类变量赋值语句,将j由0病程30. 然后调用本类的构造函数.所以,虽然父类没有定义j,但是在调用父类构造函数的时候,变量j的内存已经分配,只是还没有重新设置值.
      

  8.   


    在java中,在使用new创建一个类的实例时,开始分配空间并将成员变量初始化为默认的值。(注意并不是将变量初始化为定义的值,而是给整形赋值0) 这点与c++不同
      

  9.   

    LZ,听理论的可能还不大清楚,不过你用sysout一步步的调试,看看执行顺序一目了然。public class FileTest extends Super{
    int j=30;  
    FileTest(){
    //第六,父类的构造方法运行结束,开始运行子类的构造方法,此时J为30,调用print()方法打印j=30
    print();
    //第七,设置j为40,此时J=40,main方法中打印new FileTest().j为40,程序结束
    j=40;
    }
    void print(){
    //第四,因为子类重写了父类的方法,所以先进这里,而j这个变量在父类中还是空值,因为J是int所以为0
    System.out.println("子类:"+j);
    }
    public static void main(String[] args) {
    //第一,创建子类实例,进入父类构造方法
    System.out.println(new FileTest().j);
    }
    }
    class Super{
    int i=10;
    Super(){
    //第二,进入父类构造方法
    //第三,进入print()方法,如果子类重写了改方法那么就要进入子类的重写方法中,父类中该方法不会执行
    print();
    //第五,设置i的值
    i=20;
    }
    void print(){
    System.out.println("父类:"+i);
    }
    }