当我们将参数传递给方法时会发生什么操作?

时间:2009-08-26 20:44:14

标签: java

我知道,如果我通过:

  • 原始类型,然后将发送元素的副本
  • 对象类型,然后将发送参考副本

我认为(请核实):

  • 参考大小与对象元素大小相等
  • 对象大小是其包含的所有基本类型和引用类型大小的总和
  • 静态变量不包含在对象
  • 如果原始类型不同,那么结果类型总是至少最宽的两种类型。

如果我通过,我不确定会发生什么:

  • 'null'(空引用?)
  • 对象类型不同(第一个普通父类?)(如何找到???)
  • enum(int的副本?)
  • 匿名课程

3 个答案:

答案 0 :(得分:5)

如果您正在讨论内存中方法调用(而不是RMI或类似内容),则所有引用的大小都相同。它们是堆上对象的句柄。对象的大小无关紧要。

假设您可以编译代码,原始类型将以某种方式匹配调用方法。可以通过显式转换,也可以通过自动扩展,取决于您正在做什么(您使用int调用long方法,还是使用long调用int方法)。

引用始终是相同的,无论它是枚举,转换为不同的对象类型(对象是相同的,只是类型引用是不同的)或匿名类。在所有情况下,它都是对堆上对象实例的引用。

匿名类(或任何未声明为static的内部类)确实具有对其父级的隐式隐藏引用。

Null表示没有引用,所以我不知道大小,但JVM将有一些内部表示。我在实践中怀疑它实际上比对象引用小,就内存量而言,但它可能是,特别是在JavaME中。

应该指出的是,在实践中,Java开发人员并没有多想这些事情。只有实现JVM的人才会关心这些问题(例如,引用的大小)。你不能用语言对它们做任何事情,所以如果你因为它而遇到性能问题,请选择其他语言。

答案 1 :(得分:1)

你为什么不查看谷歌?

http://www.yoda.arachsys.com/java/passing.html

另外 - Java中没有sizeof。

答案 2 :(得分:0)

我不确定您在寻找“参考尺寸”的要点,但这里有一些我可以肯定地回答:

  

如果原始类型不同,那么结果类型总是至少最宽的两种类型。

不太正确。如果指定int并传入long,则必须向下转换为int,并且将传递的是int。如果传递一个字节,它将自动升级为int。它将始终传递一个int。

  

对象大小是它包含的所有原始类型和引用类型大小的总和

还有一个函数指针表和其他一些东西,我不认为这是直截了当的。

  

静态变量不包含在对象

我会说它们不包含在对象实例中,但是在对象实例中可能有一个指向它们的指针(在我正在讨论的指针表中)......但我不这么认为。

  

'null'(空引用?)

如果你传递null它会像c一样(我相信指向0或其他预定义的错误位置,这意味着“Null”)但你没有任何访问权限,除了将它与null比较或得到一个NPE,你不能像其他方式那样处理它

  

对象类型不同(第一个常见的父对象?)(如何找到???)

存在一个对象的元数据告诉你它是什么类型,但更重要的是有一个指针表,所以调用的“正确”方法总是只是一个指针的去引用,你不要不得不弄清楚你实际拥有什么类,并扫描“Extends”树以找到给定方法的第一个实现,而不管你的类被转换为什么,有一个指向正确的“toString”方法的指针你应该使用。

  

匿名课

这些是基于父类名称的魔术名称,并编译为常规类,但有一些特殊的例外。