我正在编写一个Polygon
类,在考虑之后我决定使用x
和y
值的数组并保存点。
这导致我出于懒惰而想到这个:
int[] x, y;
x = y = new int[NUM];
我知道数组是类,不被认为是原始的,所以会发生什么?
一方面,x
和y
是基元数组,因此数组被部分地视为基元。因此,它可以将值复制到新数组,例如普通int
:
int x, y;
x = y = 5;
但是如果它不是原始的那么x
和y
将指向内存中的相同位置并且将具有相同的变量。当您编辑一个时,第二个也将被编辑。
MyClass x, y;
x = y = new MyClass(value);
所以,我的问题是,以下哪一个想法是对的?
答案 0 :(得分:4)
在Java数组中,任何东西都是一个对象,包括基元数组。
y
和x = 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)
这确实只会创建一个数组,并使y
和int[] x, y;
x = y = new int[NUM];
引用该数组:
x
如果您想要y
和int[] x = new int[NUM];
int[] y = new int[NUM];
值的两个数组,那么创建两个数组:
x