我知道,如果我通过:
我认为(请核实):
如果我通过,我不确定会发生什么:
答案 0 :(得分:5)
如果您正在讨论内存中方法调用(而不是RMI或类似内容),则所有引用的大小都相同。它们是堆上对象的句柄。对象的大小无关紧要。
假设您可以编译代码,原始类型将以某种方式匹配调用方法。可以通过显式转换,也可以通过自动扩展,取决于您正在做什么(您使用int调用long方法,还是使用long调用int方法)。
引用始终是相同的,无论它是枚举,转换为不同的对象类型(对象是相同的,只是类型引用是不同的)或匿名类。在所有情况下,它都是对堆上对象实例的引用。
匿名类(或任何未声明为static的内部类)确实具有对其父级的隐式隐藏引用。
Null表示没有引用,所以我不知道大小,但JVM将有一些内部表示。我在实践中怀疑它实际上比对象引用小,就内存量而言,但它可能是,特别是在JavaME中。
应该指出的是,在实践中,Java开发人员并没有多想这些事情。只有实现JVM的人才会关心这些问题(例如,引用的大小)。你不能用语言对它们做任何事情,所以如果你因为它而遇到性能问题,请选择其他语言。
答案 1 :(得分:1)
答案 2 :(得分:0)
我不确定您在寻找“参考尺寸”的要点,但这里有一些我可以肯定地回答:
如果原始类型不同,那么结果类型总是至少最宽的两种类型。
不太正确。如果指定int并传入long,则必须向下转换为int,并且将传递的是int。如果传递一个字节,它将自动升级为int。它将始终传递一个int。
对象大小是它包含的所有原始类型和引用类型大小的总和
还有一个函数指针表和其他一些东西,我不认为这是直截了当的。
静态变量不包含在对象
中
我会说它们不包含在对象实例中,但是在对象实例中可能有一个指向它们的指针(在我正在讨论的指针表中)......但我不这么认为。
'null'(空引用?)
如果你传递null它会像c一样(我相信指向0或其他预定义的错误位置,这意味着“Null”)但你没有任何访问权限,除了将它与null比较或得到一个NPE,你不能像其他方式那样处理它
对象类型不同(第一个常见的父对象?)(如何找到???)
存在一个对象的元数据告诉你它是什么类型,但更重要的是有一个指针表,所以调用的“正确”方法总是只是一个指针的去引用,你不要不得不弄清楚你实际拥有什么类,并扫描“Extends”树以找到给定方法的第一个实现,而不管你的类被转换为什么,有一个指向正确的“toString”方法的指针你应该使用。
匿名课
这些是基于父类名称的魔术名称,并编译为常规类,但有一些特殊的例外。