Car c = new Car();
是new Car()对象先进堆内存,还是变量C先进栈内存呢?
首先两个可能,第一种:变量C先进栈内存,然后new Car()对象进堆内存,变量C再指向new Car()对象的内存地址值
第二种:new Car()对象先进对内存,然后变量C进栈内存,变量C指向new Car()对象的内存地址值
个人认为是第二种,因为=是赋值运算符,对象没有先进内存的话,变量的存在没有意义,
刚学,如果我问的问题太基础,还请理解
------解决方案--------------------
建底:作为新手的你不必要去纠结这个!因为很累!低层东西太多了!但是你既然问了我们就会回答!
Car c = new Car();
Car c术语:字面量!
new Car();术语:匿名对象,返回的是一引用地址!
根据JAVA分编译期.运行期原理(编译期.运行期请另行百度.)
一个CLASS文件执行会在编译期先编译;然后把CLASS文件的内容分别放到方法区跟栈!
也就是说字面量在编译期就已经有了! new String("a")是在运行期才有的!所以字面量C先进栈!
下面一个例子说明以上论据:
String a = "a"+1;
String b = new String("a")+1;
String c = "a"+1;
System.out.println(a==b);//输入结果为FALSE,B因为在编译期无法确所以为FALSE;
System.out.println(a==c);//输入结果为TRUE,a和C在编译期已经确定所以为TRUE
------解决方案--------------------
你这个问题问得有问题。。
你所谓的进内存指的是那块内存被申请了可以使用,还是那块内存上存有了有效数据?
我简单说下运行过程吧。。
首先这个c楼主的意思应该是某个方法内的局部变量,那么当这个方法被调用时,会在栈内存区新建一个Frame(具体是什么请看JVM规范,反正不是窗体那个Frame),它包括局部变量区和操作符栈(operators stack),所以理论上当一个方法被调用时,他的局部变量就已经存在了。然后运行到c = new Car()这里,首先是在堆内存上申请一块内存,申请完成后会把内存地址push到Frame里的操作符栈上,然后调用Car的构造函数,然后才是将在操作符栈上的地址保存到局部变量里。
所以如果你的意思是哪个内存先被申请,那答案是c所使用的局部变量内存。
如果你的意思是哪个先存入了有效数据,那答案是对象所在的堆内存。
上面的运行过程其实还有很多细节,比如编译期如何决定局部变量数量,操作符栈大小,如何创建的Frame,如何传递的参数,以及创建对象new dup invoke astore的过程,如果感兴趣,简单的介绍JVM规范里写得很清楚,具体的过程那就只能直接看源码了。。