abstract class A{
int i=4;           
public abstract void print();        
A3(){
int i=3; 
print();  
}

class B extends A{
private int i=2;                              
public void print(){                        
System.out.println("i= "+i);             
}在上面的的三个位置定义的i,最后打印出来i的值都是0。
我已经在B里面定义了i=2,A3()但是调用B中的print()时,B还没初始化,那这个i是哪里的?如果是B里面定义的那个i,已经在定义的赋值2了的,为什么不是等于2?或者这样说,类成员在定义的时候(比如int i)不管有没有赋初值,就已经给了内存空间??求解啊!!新手被卡这里了!!!!

解决方案 »

  1.   

    public class C {
        public static void main(String[] args){
         B3 r=new B3();
            
      

  2.   

    因为你print调用是写在父类构造函数中,那么也就是说在父类构造函数被调用时,print了,但是此时子类成员函数初始化还没有进行所以还是零
    还有几个问题
    父类成员函数可以被子类重写,也就是说在子类对象中如果不加super,调用的方法是被子类重写了的,哪怕这个方法被父类的构造函数或者其他没有被重写的方法调用父类成员变量是不会被重写的,如果从原父类一个函数中直接调用这个变量会是父类的变量,如果子类中方法直接调用则是子类中的变量,你这里,虽然print是在父类中构造函数调用的,但是print实现在子类,所以相应的i是子类中的你父类构造函数中生命的i没有任何作用,这只是构造函数的局部变量,声明周期仅在此函数中,如果你是想赋值父类的i应该去掉int,这样只是赋值父类的成员变量i
      

  3.   

    类的初始化顺序决定,因为你的print是在父类构造函数中调用的,此时子类的成员变量还没有没初始化,
    如果你在子类的构造函数中调用print你就会发现i被初始化成2了