关于new的一个小小问题。

江湖啊江湖 2012-09-21 11:36:02
比如

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

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

但是

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


问题是,B b = new B();创建了两个内存空间?创建了两个句柄吗。
...全文
479 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
e241138 2012-09-26
  • 打赏
  • 举报
回复
5楼6楼说的内存溢出是什么意思?
wuyu81010 2012-09-26
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 的回复:]

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

为什么会死循环
hwb1989 2012-09-26
  • 打赏
  • 举报
回复
按你写的代码:出现java.lang.StackOverflowError,当前线程的堆栈的空间已满。。。内存不够,你这是一个无限死循环。
江湖啊江湖 2012-09-26
  • 打赏
  • 举报
回复
大神们,代码主要为了表达的是,
new一个子类,是如何分配内存空间而已。

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

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

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

选2.
guizhaiteng 2012-09-26
  • 打赏
  • 举报
回复
弱弱的问一下A a=new B();怎么解释啊?
memoryshy 2012-09-26
  • 打赏
  • 举报
回复
同意9楼
ZangXT 2012-09-26
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 的回复:]

5楼6楼说的内存溢出是什么意思?
[/Quote]
执行一下楼主的代码。
「已注销」 2012-09-26
  • 打赏
  • 举报
回复
因为new B()反复执行,类似于递归调用。。。。
pdl1989121 2012-09-25
  • 打赏
  • 举报
回复
顶9楼以下,
wsyangzuda 2012-09-23
  • 打赏
  • 举报
回复
9楼正确,我保证。

既属于A 又属于B

构造函数只是初始化,并没有开辟内存。
杀手 2012-09-23
  • 打赏
  • 举报
回复
我也觉得9楼正确
wjzmr123 2012-09-23
  • 打赏
  • 举报
回复
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;
ZangXT 2012-09-23
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 的回复:]

奇异在8楼9楼。

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

还是开辟了新的内存空间(包括A,B)
[/Quote]
9楼正确。
江湖啊江湖 2012-09-23
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 的回复:]

奇异在8楼9楼。

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

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

奇异在8楼9楼。

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

还是开辟了新的内存空间(包括A,B)
江湖啊江湖 2012-09-23
  • 打赏
  • 举报
回复
还是同时创建了A,B内存空间。
江湖啊江湖 2012-09-23
  • 打赏
  • 举报
回复
奇异在8楼9楼。

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

还是开辟了新的内存空间(包括A,B)
树成 2012-09-22
  • 打赏
  • 举报
回复
那我也纠正8楼的一些错误观点吧。
new B() 没有创建一个A对象与一个B对象,而是创建了一个既属于A也属于B的一个对象,这很好理解么,例如一个类叫衣服,另一个类叫衬衫继承衣服,如果买一件衬衫是实例化的话,我买这个衬衫难道能叫我买了衬衫与衣服两个东西么?当然,你可以自以为是的说java就是这么实现的,那请你研究好了,有根据了再说好么,别想当然.....。
另外,还想说明的是,构造函数并不完成开辟内存空间的责任,它只完成初对象初始化的工作,B对象确实会调用A对象的构造函数,但是并不代表就会开辟内存空间再生成一个A对象。
supermail988 2012-09-22
  • 打赏
  • 举报
回复
继承先不谈,首先 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()对象.
a234152738 2012-09-22
  • 打赏
  • 举报
回复
b是a的子类 继承了父类的东西 包括那片内存空间。b自身也分配了一片内存空间
MrBye 2012-09-22
  • 打赏
  • 举报
回复
内存溢出~~
加载更多回复(6)

62,621

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧