JAVA中子类调用父类带参的构造方法时修改了父类的成员变量,但父类的成员变量没有变化?

class A{
int a;
A(int i){a=i;}
}
class B extends A{
int a,b;
B(int i,int j){
super(i); // 这里修改了父类a的值
b=j;
a=i+j;

}
}
public class AB {
public static void main(String args[]){
A a1=new A(9);
System.out.println(a1.a); 输出是 9
B b=new B(3,5);
System.out.println(a1.a); // 为什么输出还是9,不是应该输出3吗?
}

这是内存空间分配的问题,你的主方法中类型+变量名表示在堆栈中开辟一个空间,new代表在堆中开辟空间放在内存池中。一个引用绑定一个堆空间,你的主方法中 第一步开辟空间建立绑定机制,这个a1就代表了堆中的a的值为9,你用B的构造方法调用A中的构造方法,由于存储的是基本数据类型,它会直接放在栈中,那么你的第二次打印依旧绑定在new空间中的。你可以在a前加个静态static那么他就会存放在常量存储器中,就会打印出来3;
温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-10-27
大哥你看清楚了,两个对象都不一样,B b=new B(3,5)的意思是创建一个对象b,刚才创建了一个对象a1,所以b.a=8,a1对象不变还是9,若是把 A c=b;那么这时c.a=?呢,其实c.a=3;明白了吗?属性的静态绑定,和方法的动态绑定去复习下吧!追问

那创建b时super(i)这个方法里a=i;修改的a是属于谁的?
还有c.a为什么=3呢?对象c的成员变量不是还没被赋值吗?

追答

当然是父类的a了,子类覆盖了父类的变量,所以我说c.a=3;A c=b,赋值了呀,因为属性是静态绑定,方法是动态绑定。

相似回答