一个对象存在于堆上。它由实例变量组成。它是否也包含方法,当我们从对象调用方法时,它如何进入堆栈?
如果我创建一个对象
Test obj=new Test();
obj.start();
方法代码在哪里?它是在堆内存中的对象中还是在其他地方?
一个对象存在于堆上。它由实例变量组成。它是否也包含方法,当我们从对象调用方法时,它如何进入堆栈?
如果我创建一个对象
Test obj=new Test();
obj.start();
方法代码在哪里?它是在堆内存中的对象中还是在其他地方?
方法代码不在堆中 - 它位于加载类数据时填充的静态内存区域。对象实例包含对该静态内存区域的引用,它允许运行时系统在调用时查找适当的方法——这就是方法覆盖的工作方式。假设你正在调用一个实例的equals
方法——在运行时,JVM 会查看类的静态内存区域,然后找到被覆盖equals
方法的地址,或者它遵循指向超类静态内存区域的链接以找到它的equals
方法,当 JVM 找到被覆盖的方法时停止,equals
或者当 JVMObject
使用其默认equals
方法找到内存区域时停止。
方法代码不会为每个实例重复。每个方法只存储一次。
如http://javapapers.com/core-java/java-jvm-memory-types/所示:
(...)方法区是非堆内存的一部分。它存储每个类的结构、方法和构造函数的代码。每类结构意味着运行时常量和静态字段。
另请参阅:方法存在于何处?堆栈还是堆中?