请帮我清除这个让我烦恼的混乱。当我写下面的代码时,内存中发生了什么以及对象Jhon是如何存储的?(如果我认为Jhon是一个对象而不仅仅是一个对象的引用)
class Human{
String Name;
float height;
}
class Student extends Human{
int Student_ID;
Student Jhon = new Student();
}
我的问题是,Jhon是一个对象,还是对创建的对象的引用?这里的参考变量是什么?这里的对象变量是什么?
答案 0 :(得分:2)
我说the following line from JLS很好地解释了这一点:
类实例创建表达式的值是对新创建的指定类对象的引用。
因此,在以下代码中:
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app="app" ng-controller="controller as c">
<select ng-model="c.field" ng-options="(f.label || f.name || f.value) for f in c.fields">
<option value="">-- Select an Option --</option>
</select>
Selected field: {{c.field | json}}
</div>
重申:类实例创建表达式的值是引用到新创建的对象。那个对象是在内存中的某个地方创建的;但关键是该值不是该对象,而是对它的引用。
然后将该引用分配给变量,Student Jhon = new Student();
^-----------^ Class instance creation expression
^----------^ Variable declaration
。所以Jhon
不是对象,也不是引用,而是一个变量,其值是对变量的引用。
答案 1 :(得分:0)
刚加入@Andy Turner的回复。 Jhon是一个变量,指向对Java虚拟机(JVM)内存堆中保存的类学生的实例的引用。程序员无法直接访问堆中的对象,这一切都是由JVM完成的。堆由JVM管理,当堆中的对象不再具有指向对它的引用的变量时,它将被JVM垃圾回收清理。程序员不必关心这个过程。
See more detailed explanantion in official Oracle docs
Also see helpful disccusion in opening chapter of David Eck's book