abstract class Fu
{
private String name;
abstract void work();
Fu(String name)
{
this.name=name;
}
}class Z1 extends Fu
{
Z1(String name)
{
super(name);
}
void work()
{
....
}
}class Z2 extends Fu
{
Z2(String name)
{
super(name);
}
void work()
{
....
}
}
class Main
{
main(String [] args)
{
Z1 a=new Z1("z1");
Z2 b=new Z2("z2");
}
}
上面是一段伪代码,我的问题是父类是一个抽象类,肯定不能被实例化,里面有个私有成员变量,肯定不能被子类继承到,那么,按照我的理解,内存里面就只有一个name变量(除了形参name)。但是这个程序中“z1”和“z2”却是同时存在于内存中的,我推断的就是z2会覆盖z1,我知道肯定内存中不会用一个name同时指向两个字符串值,我就弄不明白为什么会出现两个name引用呢?请高手帮我画出内存分配图。对了,构造函数是用来初始化对象的把。跪谢!!!!

解决方案 »

  1.   

    "但是这个程序中“z1”和“z2”却是同时存在于内存中的,我推断的就是z2会覆盖z1",
    Z2和Z1是不同的对象,虽然都从一个父类里继承出来,但系统会给它们分别分配内存空间,何以”z2会覆盖z1“呢?
      

  2.   

    你应该明白类和对象的关系,类是一个模板,而对象是类的实例,其实类就是一种数据类型。如类就是狗,是一个概念,而对象是比如,你家养的小黄狗,或者你家邻居的小黑狗,是一个个实在的东西。在定义类的时候是没有内存分配的,只有在实例化一个类的时候才会给对象按照类定义的模式分配内存给它。所以在new 一个对象时在内存中就有了它的一块,在你new 另一个的时候又有了它的一块内存。就像小黄狗和小黑狗。所以就有了“z1”“z2”两个字符串。
      

  3.   

    初始化对象的时候,只要是new一个对象,就会在内存中开辟出一个空间,new几个就会开辟出几个不同的内存空间。所以不存在z2覆盖z1
      

  4.   

    如上, "只要是new一个对象,就会在内存中开辟出一个空间".
    哪怕是
    Z1 a=new Z1("z1");
    Z1 b=new Z1("z1");这样看起来几乎一模一样的代码, 也一样是有两块内存空间的.
      

  5.   

    楼上几位说的都对,我也知道,但是我问的是name变量不是两个子类的成员变量,而是父类中的一个私有变量,父类不能被实例化,也就是说name变量在内存里只能有一个。因为我下面new的是子类对象,而不是父类对象,而子类对象中并没有name成员变量啊,因为没有从父类中继承下来。
      

  6.   

    首先是这样:在堆空间分配2个局部变量a和b,当new Z1和Z2的时候在栈空间会分配2块内存,这时候会调用Z1 Z2的构造方法,构造方法带了一个形参,此时又会在堆分配一个形参name,将"z1"和"z2"分别赋给name,在此时会先调用父类的构造方法,执行完父类的构造方法后,父类中的name就会被赋值
      

  7.   

    初始化对象的时候,只要是new一个对象,就会在内存中开辟出一个空间,new几个就会开辟出几个不同的内存空间。所以不存在z2覆盖z1
      

  8.   

    在new的时候在内存中的堆中会为新产生的对象开辟一块新的空间