关于Java对象的方法的信息保存在哪里? - java

我的同事问了一个非常有趣的问题,我无法给他答案。

假设我们有以下课程:

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

Java:静态字段在内存中的哪个位置? - java

如果我们将对象存储在对象的静态字段中,那么JVM如何为它分配内存?它是否存在于“隐式”(不确定我是否使用正确的单词)类对象中?静态字段与对象字段有何不同? 参考方案 静态字段是类变量,并且在该类的所有实例之间共享。实例变量(或我认为您引用它们的对象字段)属于类的各个实例,并且不共享。至于它们存储在内存中的位置将根据JVM的实现而定,因此没有理由需要两个不同的…

Java-搜索字符串数组中的字符串 - java

在Java中,我们是否有任何方法可以发现特定字符串是字符串数组的一部分。我可以避免出现一个循环。例如String [] array = {"AA","BB","CC" }; string x = "BB" 我想要一个if (some condition to tell wheth…

Java Scanner读取文件的奇怪行为 - java

因此,在使用Scanner类从文件读取内容时,我遇到了一个有趣的问题。基本上,我试图从目录中读取解析应用程序生成的多个输出文件,以计算一些准确性指标。基本上,我的代码只是遍历目录中的每个文件,并使用扫描仪将其打开以处理内容。无论出于何种原因,扫描程序都不会读取其中的一些文件(所有UTF-8编码)。即使文件不是空的,scanner.hasNextLine()在…

Java:正则表达式模式匹配器是否有大小限制? - java

我的模式类似于OR:“word1 | word2 | word3”我大约有800个字。可能有问题吗? 参考方案 您仅受记忆和理智的限制。 :)

Java-非泛型类扩展了泛型类 - java

我想知道如何(如果可能)创建一个类,它是泛型类的特定类型。具体来说,我有一个实现所有必需方法的abstract class Stack<Type>,我想有一个class StackInteger,而StackInteger的实例也是Stack<Integer>的实例。我看到我可以做这样的事情:class StackInteger { …