日期:2014-05-20  浏览次数:20792 次

新手求助。关于类成员定义以及内存分配问题!!
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)不管有没有赋初值,就已经给了内存空间??

求解啊!!新手被卡这里了!!!!

------解决方案--------------------
因为你print调用是写在父类构造函数中,那么也就是说在父类构造函数被调用时,print了,但是此时子类成员函数初始化还没有进行所以还是零
还有几个问题
父类成员函数可以被子类重写,也就是说在子类对象中如果不加super,调用的方法是被子类重写了的,哪怕这个方法被父类的构造函数或者其他没有被重写的方法调用

父类成员变量是不会被重写的,如果从原父类一个函数中直接调用这个变量会是父类的变量,如果子类中方法直接调用则是子类中的变量,你这里,虽然print是在父类中构造函数调用的,但是print实现在子类,所以相应的i是子类中的

你父类构造函数中生命的i没有任何作用,这只是构造函数的局部变量,声明周期仅在此函数中,如果你是想赋值父类的i应该去掉int,这样只是赋值父类的成员变量i