【问题标题】:Is array of primitives assigned to variable as an Object (by reference) or by value?原语数组是作为对象(通过引用)还是按值分配给变量的?
【发布时间】:2015-08-30 04:38:56
【问题描述】:

我正在编写一个Polygon 的类,经过考虑后我决定使用xy 值的数组并保存点。

出于懒惰,这让我想到了这个:

int[] x, y;
x = y = new int[NUM];

我知道数组是类,不被视为原始数组,那么这里会发生什么?

一方面,xy 是原始数组,因此该数组被部分视为原始数组。所以它可能会将值复制到一个新数组中,就像普通的int

int x, y;
x = y = 5;

但如果它不是原始的,那么xy 将指向内存中的相同位置并且具有相同的变量。当您编辑一个时,第二个也将被编辑。

MyClass x, y;
x = y = new MyClass(value);

那么,我的问题是,以下哪个想法是正确的?

【问题讨论】:

  • 你可以在 Eclipse 中输入这个,运行它并找出 ;)
  • 附带说明,我会避免使用 x = y = z;
  • @vertti true。这总是会降低代码的可读性,而且我们可能从 1980 年开始就不必节省代码空间。

标签: java arrays oop


【解决方案1】:

这确实只会创建一个数组,并使xy 引用该数组:

int[] x, y;
x = y = new int[NUM];

如果您想要 xy 值的两个数组,则创建两个数组:

int[] x = new int[NUM];
int[] y = new int[NUM];

【讨论】:

    【解决方案2】:

    在 Java 中,任何东西的数组都是一个对象,包括基元数组。

    xy 都将指向同一个数组对象。要将它们实例化为不同的对象,请使用

    x = new int[n];
    y = new int[n];
    

    确定 Java 中的某物是否为对象的一个​​好方法是尝试对其调用方法。

    new int[1].toString(); //legal
    1.toString(); //illegal
    

    但更好的方法是知道实际上除了单个原语之外的任何东西都是对象。 :)

    【讨论】:

      【解决方案3】:

      根据Java spec, section 4.3.1,对象被正式定义为“类实例或数组”,这意味着数组不会被视为基元,并且将始终使用引用语义。

      【讨论】:

      • 这个答案对于 Java 规范的链接很有价值。
      【解决方案4】:

      一方面,x 和 y 是原始数组,所以数组是部分的 被认为是原始的,因此它可以将值复制到一个新数组中,例如 正常整数:

      您在“原始数组”中是正确的,但在“部分被视为原始数组”中是正确的。数组是一个数组,没有部分或完整。您定义的方式,它是一个基元数组,这意味着将分配一个堆空间来存储原始 int 值。

      但是如果它不是原始的,那么 x 和 y 将指向同一个地方 在内存中,并且将具有相同的变量,当您编辑一个时, 第二个也将被编辑。

      是的,所以这个陈述的后面部分是正确的,“内存中的同一位置”

      希望这会有所帮助!

      【讨论】:

      • 好的,谢谢。我说的是部分的,因为从我读到的地方,他们说原始数组是原始的,我不知道这是不是真的。
      猜你喜欢
      • 2020-04-17
      • 2012-10-11
      • 1970-01-01
      • 1970-01-01
      • 2018-06-20
      • 1970-01-01
      • 2014-12-26
      相关资源
      最近更新 更多