如何用Java创建对象?具体而言,创建对象时内存中的进程是什么?

时间:2017-09-19 22:08:07

标签: java oop object

请帮我清除这个让我烦恼的混乱。当我写下面的代码时,内存中发生了什么以及对象Jhon是如何存储的?(如果我认为Jhon是一个对象而不仅仅是一个对象的引用)

class Human{
   String Name;
   float height;
}

 class Student extends Human{
   int Student_ID;
   Student Jhon = new Student();
}

我的问题是,Jhon是一个对象,还是对创建的对象的引用?这里的参考变量是什么?这里的对象变量是什么?

2 个答案:

答案 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