class B{}
class A{
public A(B b){
}
}当new一个A对象的时候,在内存上是先给A分配内存,还是先给B分配内存呢
有点迷惑
class A{
public A(B b){
}
}当new一个A对象的时候,在内存上是先给A分配内存,还是先给B分配内存呢
有点迷惑
解决方案 »
- 一个eclipse操作的问题,还是不清楚怎么操作
- 悬赏!!!java反编译高手在哪里?
- 求救:JRUN 的global.jsa有人改过吗?
- 这种东西到底是什么?
- 一个关于接口的简单问题
- java可以从串口读数据吗,如果能怎么读用那个类库?(在线等,谢谢!)
- 请问我数据库连接为什么报java.sql.SQLException: [Microsoft][ODBC Microsoft Access Driver] Could not find
- 求助!本人下个星期考SCJP急需好的题库!高分求教!
- 在java中如何获得某一机器的特定信息,如硬盘的编号等,主要用在确定软件是否运行在授权的机器上????????????
- 菜鸟求救: 到底应该如何学习java???
- 请教!请教!呵呵!有你的回报!j2se问题!
- 请大家帮我看看这段代码,每次我都输的是正确的用户名和密码,调试时为啥总说我的用户名或密码错误呢?
new A(new B());
对于这句,肯定是先 new B() 再把它作为参数传递给A,完成new A()的操作
现在有点想明白了,在执行构造器之前,已经执行了声明语句,所以应该先给A分配的内存。再new B,再把B的引用交给A.是这样吗程序:
class B{}
class A{
B b;
public A(B b){
this.b=b;
}
}
{
public newAB(B b){
System.out.println("A");
}
public static void main(String[] args)
{
new newAB(new B());
//打印出 B A
}
}
class B{
public B(){
System.out.println("B");
}
}
内存分配是在构造器前还是后还是中?
B b = null;new A(b);你说创建一个对象A,给A分配内存要不要给B分配内存?
首先在执行A的构造函数之前,对A构造函数之前传入的参数最先被初始化(在think in java中是这样描述的:所有变量在函数使用它之前被初始化)这样B先分配堆空间,分配之后,垃圾回收启动,B没有被使用,于是又回收了
等到成员变量都初始化完毕以后,执行构造器之前,再为类B分配?
也说自己看过thinking in java,我就忍不住了
reference在初始化的时候是什么值?不是null么
这个时候跟gc有个P关系,我怒了
同意,
其实Java的变量是地址引用,new A() 时的申请的是放地址引用的内存。
所以如果在new A 之前b 赋初值为null,则未创建B对象,只声明了引用,
如果在new A之前 b 赋初值为 new B ,那么就是先B 后A了
public class Test {
public static void main(String[] args){
new A(new B());
}
}0: new #13; //#13 是常量池中class A的CONSTANT_Class_info的常量表入口地址
3: new #15; //#15 同上 class B
6: dup
7: invokespecial #17; //Method B."<init>":()V
10: invokespecial #18; //Method A."<init>":(LB;)V
13: returnnew指令 -- 在堆中为新对象分配一个足够大的内存空间。并将对象的实例变量设置为默认值。注意,这条指令并不会调用构造器进行初始化。invokespecial指令 -- 调用构造器进行初始化。我们可以看到,在堆中开辟对象空间的顺序是 先A后B,而调用构造器进行初始化的顺序是 先B后A
嗯嗯,我就是这么理解的。。