比如  class A{  
     A a = new A();
  }大家都知道创建了一个A对象,并一个内存空间,指向a但是  class B extends A{
     B b = new B();
  }问题是,B b = new B();创建了两个内存空间?创建了两个句柄吗。

解决方案 »

  1.   

    创建了两个句柄。由于B继承A,子类B会自动的调用父类的构造函数,A与B的hashcode不一样,a指向A对象的地址,b指向B对象的地址。
      

  2.   

    b是a的子类  继承了父类的东西 包括那片内存空间。b自身也分配了一片内存空间
      

  3.   

    继承先不谈,首先    B b = new B();   我要纠正你在内存中引用错误的理解
    1.new B().在堆内存中开辟一个空间,并且空间附有地址值,
    2.变量b 称之为引用变量,在栈内存中指向了堆内存中的B(),
    3.这时把堆内存中B()的地址值赋值给了栈内存中的b.
    4.这样栈内存中的b拿到了堆内存中的地址值,指向了堆内存中的B();
    接着说继承,,当B继承 A.在创建B对象的同时,,也就是说 当B还没创建完的时候,,刚初始化B的构造函数的时候.
    会先创建A对象,当A对象创建完成之后才会继续创建B对象..引用关键就是 栈内存中的b,指向了堆内存中的B(),但是堆内存中的B()里面有A()对象.
      

  4.   

    那我也纠正8楼的一些错误观点吧。
    new B() 没有创建一个A对象与一个B对象,而是创建了一个既属于A也属于B的一个对象,这很好理解么,例如一个类叫衣服,另一个类叫衬衫继承衣服,如果买一件衬衫是实例化的话,我买这个衬衫难道能叫我买了衬衫与衣服两个东西么?当然,你可以自以为是的说java就是这么实现的,那请你研究好了,有根据了再说好么,别想当然.....。
    另外,还想说明的是,构造函数并不完成开辟内存空间的责任,它只完成初对象初始化的工作,B对象确实会调用A对象的构造函数,但是并不代表就会开辟内存空间再生成一个A对象。
      

  5.   

    A a = new A();   B b=new B()    创建了一个对象,会给对象分配内存,class B extends A ,B 继承了 A,但是a的内存没有b 的大,因为b是子类  并且A  a = new B()
    这个关系就充分说明了a,b两个之间的关系
      

  6.   

    奇异在8楼9楼。到底是开辟了B的内存空间(包括B)还是开辟了新的内存空间(包括A,B)
      

  7.   


    奇异在8楼9楼。到底是开辟了B的内存空间(包括A)还是开辟了新的内存空间(包括A,B)
      

  8.   

    public class Test
    {
    public static void main(String[] args)
    {
    System.out.println(new B());
    }
    }class A
    {
    private String str; public A()
    {
    this.str = "abc";
    } public String toString()
    {
    return this.str;
    }
    }class B extends A
    {
    }result : abc;
      

  9.   

    弱弱的问一下A a=new B();怎么解释啊?
      

  10.   

    大神们,代码主要为了表达的是,
    new一个子类,是如何分配内存空间而已。1、开辟了B的内存空间(包括B)。2、开辟了新的内存空间(包括A,B)。3、同时分配A对象内存,B对象内存。选2.
      

  11.   

    按你写的代码:出现java.lang.StackOverflowError,当前线程的堆栈的空间已满内存不够,你这是一个无限死循环。 
      

  12.   

    因为new B()反复执行,类似于递归调用。