是作为Object(通过引用)或值分配给变量的基元数组吗?

时间:2015-06-14 17:24:29

标签: java arrays oop

我正在编写一个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);

所以,我的问题是,以下哪一个想法是对的?

4 个答案:

答案 0 :(得分:4)

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

yx = new int[n]; y = new int[n]; 都将指向同一个数组对象。要将它们实例化为不同的对象,请使用

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

确定Java中某些东西是否为对象的好方法是尝试在其上调用方法。

{{1}}

但更好的方法是知道除了单个基元之外的任何东西都是一个对象。 :)

答案 1 :(得分:4)

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

答案 2 :(得分:3)

  

一方面,x和y是基元数组,因此数组是部分的   被认为是原始的,所以它可以将值复制到一个新的数组,比如   normal int:

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

  

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

这是,所以后来这个陈述的一部分是正确的“记忆中的同一个地方”

希望这有帮助!

答案 3 :(得分:2)

这确实只会创建一个数组,并使yint[] x, y; x = y = new int[NUM]; 引用该数组:

x

如果您想要yint[] x = new int[NUM]; int[] y = new int[NUM]; 值的两个数组,那么创建两个数组:

x