我的同事刚问我一个非常有趣的问题,我不能给他一个答案.
我们假设我们有以下课程:
public class Person { String name; public Person(String name) { this.name = name; } public void print() { System.out.println("xxx"); } }
现在,我们正在创建对象:
Person p1 = new Person("a"); Person p2 = new Person("b"); Person p3 = new Person("c"); Person p4 = new Person("d"); Person p5 = new Person("e"); Person p6 = new Person("f"); Person p7 = new Person("g"); Person p8 = new Person("h");
问题是:
我们是否保留每个单个对象中可用方法的信息?如果我们创建一个新对象p9
,JVM是否会创建仅包含字段信息的对象,还是会向该对象添加有关方法的信息?
另一个问题:
如果我调用会发生什么p1.print()
?是否p1
必须要求Person
类提供此方法,还是已经保存在p1
对象中?
对于所有实例,方法的代码不会重复,这是完全没有必要的.代码位于内存中的特殊区域,并由所有实例共享.另一方面,实例变量所需的内存自然归每个实例所有.
至于如何调用方法,对象实际上并不需要在每次调用方法时都要求类,它有一个指向方法代码的指针,并且可以立即调用它.
有关JVM内部工作方式的更多信息,请参阅此处:http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-2.html