按值确认Java复制
关于可变位置的问题,并确认执行了副本按值确认Java复制,java,Java,关于可变位置的问题,并确认执行了副本 @org.junit.Test public void question() { int c[] = new int[]{0}; /*Questions: * 1.) Is j in the stack? * 2.) When assigning j, is a copy of the value c[0] performed?*/ int j = c[0]; } 是的,c[0]的结果被复制到j变量中,因为int
@org.junit.Test
public void question() {
int c[] = new int[]{0};
/*Questions:
* 1.) Is j in the stack?
* 2.) When assigning j, is a copy of the value c[0] performed?*/
int j = c[0];
}
是的,
c[0]
的结果被复制到j
变量中,因为int是一种基本类型,并且是按值复制的。如果要使用Integer
类,则会复制引用而不是值本身。是的,c[0]
的结果会复制到j
变量中,因为int是一种基本类型,并且是按值复制的。如果要使用Integer
类,则将复制引用而不是值本身。Java只复制值。有时这些值是对对象的引用,但这里的值是int
原语。j
的值在堆栈上,因为它是一个局部变量(与c
的值一样,后者是对自身位于堆上但很快将被垃圾收集的数组的引用)。Java只复制值。有时这些值是对对象的引用,但这里的值是int
原语。j
的值在堆栈上,因为它是一个局部变量(与c
的值一样,后者是对自身位于堆上但很快将被垃圾收集的数组的引用)。Java总是按值传递。它的意思是当X=Y时,X得到Y的值。如果是像int这样的原语,那么值会被复制,因为原语可以直接作为值使用。如果是对象,则复制对对象的引用,因为对象仅通过引用可用 Java总是按值传递。它的意思是当X=Y时,X得到Y的值。如果是像int这样的原语,那么值会被复制,因为原语可以直接作为值使用。如果是对象,则复制对对象的引用,因为对象仅通过引用可用 我认为j
是一个副本。测试它的方法是修改c[0]
并查看j
的值是否更改我没有考虑如何按照您的建议进行测试。我试过了,并按照您的建议进行了复制。@jpuriol所说的术语是“别名”,即两个引用指向同一个对象,并且该对象被修改(而不是将引用更改为指向另一个对象)。与别名相关的问题是使用不可变对象的主要动机之一(所有的基本包装,如Integer
都是不可变的)。我认为j
是一个副本。测试它的方法是修改c[0]
并查看j
的值是否更改我没有考虑如何按照您的建议进行测试。我试过了,并按照您的建议进行了复制。@jpuriol所说的术语是“别名”,即两个引用指向同一个对象,并且该对象被修改(而不是将引用更改为指向另一个对象)。与别名相关的问题是使用不可变对象的主要动机之一(所有的基本包装,如Integer
都是不可变的)。不,Java总是复制值。如果OP使用了Integer
类,那么数组元素的值将是一个引用,并且该值将被复制。但是它仍然会被复制-在j
和c[0]
之间没有持久的关联。。。如果将c[0]
的值更改为不同的引用,则不会更改j
。这样会更好一些,但它表明数组元素的值将是整数
对象-不会是。变量的值,包括数组元素,从来都不是对象-只有引用或基元类型值。语句j=c[0]
总是复制数组元素的值c[0]
,无论这是否是引用。@JonSkeet我喜欢在回答问题时感到开悟,谢谢Daisy Shipton:)不,Java总是复制值。如果OP使用了Integer
类,那么数组元素的值将是一个引用,并且该值将被复制。但是它仍然会被复制-在j
和c[0]
之间没有持久的关联。。。如果将c[0]
的值更改为不同的引用,则不会更改j
。这样会更好一些,但它表明数组元素的值将是整数
对象-不会是。变量的值,包括数组元素,从来都不是对象-只有引用或基元类型值。语句j=c[0]
总是复制数组元素的值c[0]
,无论这是否是引用。@JonSkeet我喜欢在回答问题时感到开朗,谢谢Daisy Shipton:)谢谢确认。在Java中无法保存对原语的引用?@Rodrigomez引用是指向对象的“指针”(或多或少)。引用和基本体都是立即值,不能有对基本体的引用。根据您的目标,您可以引用一个基元数组(数组是一个对象),或者使用包装类,例如Integer
或AtomicInteger
。感谢您的确认。在Java中无法保存对原语的引用?@Rodrigomez引用是指向对象的“指针”(或多或少)。引用和基本体都是立即值,不能有对基本体的引用。根据您的目标,您可以引用一个基元数组(数组是一个对象),或者使用包装类,例如Integer
或AtomicInteger
。