当前位置:编程学习 > JAVA >>

关于new的一个小小问题。

比如

  class A{  
     A a = new A();
  }

大家都知道创建了一个A对象,并一个内存空间,指向a

但是

  class B extends A{
     B b = new B();
  }

问题是,B b = new B();创建了两个内存空间?创建了两个句柄吗。 --------------------编程问答-------------------- 创建了两个句柄 --------------------编程问答--------------------
引用 1 楼  的回复:
创建了两个句柄


同时指向 b 地址?? --------------------编程问答-------------------- 好像是不一样的吧,
我觉得是创建了两个句柄,但是是第一个有自己的指向吧。 --------------------编程问答-------------------- 创建了两个句柄。由于B继承A,子类B会自动的调用父类的构造函数,A与B的hashcode不一样,a指向A对象的地址,b指向B对象的地址。 --------------------编程问答-------------------- 这个将创建无数个对象,肯定是内存溢出。 --------------------编程问答-------------------- 内存溢出~~ --------------------编程问答-------------------- b是a的子类  继承了父类的东西 包括那片内存空间。b自身也分配了一片内存空间 --------------------编程问答-------------------- 继承先不谈,首先    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()对象. --------------------编程问答-------------------- 那我也纠正8楼的一些错误观点吧。
new B() 没有创建一个A对象与一个B对象,而是创建了一个既属于A也属于B的一个对象,这很好理解么,例如一个类叫衣服,另一个类叫衬衫继承衣服,如果买一件衬衫是实例化的话,我买这个衬衫难道能叫我买了衬衫与衣服两个东西么?当然,你可以自以为是的说java就是这么实现的,那请你研究好了,有根据了再说好么,别想当然.....。
另外,还想说明的是,构造函数并不完成开辟内存空间的责任,它只完成初对象初始化的工作,B对象确实会调用A对象的构造函数,但是并不代表就会开辟内存空间再生成一个A对象。 --------------------编程问答-------------------- A a = new A();   B b=new B()    创建了一个对象,会给对象分配内存,

class B extends A ,B 继承了 A,但是a的内存没有b 的大,因为b是子类  并且A  a = new B()
这个关系就充分说明了a,b两个之间的关系
--------------------编程问答-------------------- 奇异在8楼9楼。

到底是开辟了B的内存空间(包括B)

还是开辟了新的内存空间(包括A,B) --------------------编程问答-------------------- 还是同时创建了A,B内存空间。 --------------------编程问答--------------------
引用 11 楼  的回复:
奇异在8楼9楼。

到底是开辟了B的内存空间(包括B)

还是开辟了新的内存空间(包括A,B)


奇异在8楼9楼。

到底是开辟了B的内存空间(包括A)

还是开辟了新的内存空间(包括A,B) --------------------编程问答--------------------
引用 11 楼  的回复:
奇异在8楼9楼。

到底是开辟了B的内存空间(包括B)

还是开辟了新的内存空间(包括A,B)

9楼正确。 --------------------编程问答-------------------- 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楼正确 --------------------编程问答-------------------- 9楼正确,我保证。

既属于A 又属于B

构造函数只是初始化,并没有开辟内存。 --------------------编程问答-------------------- 顶9楼以下, --------------------编程问答-------------------- 5楼6楼说的内存溢出是什么意思? --------------------编程问答--------------------
引用 19 楼  的回复:
5楼6楼说的内存溢出是什么意思?

执行一下楼主的代码。 --------------------编程问答-------------------- 同意9楼 --------------------编程问答-------------------- 弱弱的问一下A a=new B();怎么解释啊? --------------------编程问答-------------------- 大神们,代码主要为了表达的是,
new一个子类,是如何分配内存空间而已。

1、开辟了B的内存空间(包括B)。

2、开辟了新的内存空间(包括A,B)。

3、同时分配A对象内存,B对象内存。

选2. --------------------编程问答-------------------- 按你写的代码:出现java.lang.StackOverflowError,当前线程的堆栈的空间已满。。。内存不够,你这是一个无限死循环。  --------------------编程问答--------------------
引用 24 楼  的回复:
按你写的代码:出现java.lang.StackOverflowError,当前线程的堆栈的空间已满。。。内存不够,你这是一个无限死循环。


为什么会死循环 --------------------编程问答-------------------- 因为new B()反复执行,类似于递归调用。。。。
补充:Java ,  Java SE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,