实例化对象时,实际上只有非静态数据"已创建",并且引用了创建它的对象类型.
没有任何方法被复制.
创建它的类的"引用"实际上是一个指针分派表.每个可用于该类的方法都有一个指针.指针总是指向该方法的"正确"(通常是对象树中最低/最具体的)实现.
这样,如果您对另一个方法进行了顶级调用,但另一个方法已被覆盖,则将调用重写的方法,因为这是表中指针指向的位置.由于这种机制,调用重写方法不应该花费更多时间而不是顶级方法.
指针表+成员变量是类的"实例".
变量问题与完全不同的机制"名称空间"有关.变量根本不是"Subclassed"(它们不会进入调度表),但公共或受保护的变量可以被局部变量隐藏.这完全由编译器在编译时完成,与运行时对象实例无关.编译器确定您真正想要的对象,并将对它的引用填入您的代码中.
范围规则通常倾向于"最近"变量.任何远离同名的东西都会被忽略(阴影),以支持更接近的定义.
如果您感兴趣,可以更加具体地了解内存分配:所有"OBJECTS"都分配在"Heap"上(实际上比真正的堆更高效和漂亮,但是相同的概念.)变量总是指针 - Java永远不会复制对象,你总是复制指向该对象的指针.方法参数和局部变量的变量指针分配在堆栈上完成,但即使在堆栈上创建变量(指针),它们指向的对象仍然永远不会在堆栈上分配.
我很想写一个例子,但这已经太久了.如果你想让我输出一些带有扩展关系的类,以及他们的方法和数据如何影响生成的代码,我可以......只是问.
实例化对象时,实际上只有非静态数据"已创建",并且引用了创建它的对象类型.
没有任何方法被复制.
创建它的类的"引用"实际上是一个指针分派表.每个可用于该类的方法都有一个指针.指针总是指向该方法的"正确"(通常是对象树中最低/最具体的)实现.
这样,如果您对另一个方法进行了顶级调用,但另一个方法已被覆盖,则将调用重写的方法,因为这是表中指针指向的位置.由于这种机制,调用重写方法不应该花费更多时间而不是顶级方法.
指针表+成员变量是类的"实例".
变量问题与完全不同的机制"名称空间"有关.变量根本不是"Subclassed"(它们不会进入调度表),但公共或受保护的变量可以被局部变量隐藏.这完全由编译器在编译时完成,与运行时对象实例无关.编译器确定您真正想要的对象,并将对它的引用填入您的代码中.
范围规则通常倾向于"最近"变量.任何远离同名的东西都会被忽略(阴影),以支持更接近的定义.
如果您感兴趣,可以更加具体地了解内存分配:所有"OBJECTS"都分配在"Heap"上(实际上比真正的堆更高效和漂亮,但是相同的概念.)变量总是指针 - Java永远不会复制对象,你总是复制指向该对象的指针.方法参数和局部变量的变量指针分配在堆栈上完成,但即使在堆栈上创建变量(指针),它们指向的对象仍然永远不会在堆栈上分配.
我很想写一个例子,但这已经太久了.如果你想让我输出一些带有扩展关系的类,以及他们的方法和数据如何影响生成的代码,我可以......只是问.