我知道通过以下内容,可以参考
public class MyClass
{
public Integer value;
}
public class Main
{
public static void main( String[] args )
{
MyClass john = new MyClass();
john.value = 10;
MyClass bob = john;
bob.value = 20;
System.out.println(Integer.toString(john.value)); // Should print value of "20"
}
}
但是,如何使用原始数据类型进行类似的引用?
public class Main
{
public static void main( String[] args )
{
Integer x = 30;
Integer y = x;
y = 40;
System.out.println(Integer.toString(x)); // Prints "30". I want it to print "40"
}
}
答案 0 :(得分:3)
简单回答:你没有。原始值总是按值传递(即复制它们)。
Integer
之类的包装器对象也是不可变的,即y = 40
将创建一个值为40的新Integer
对象,并将其分配给y
。
要实现您的目标,您需要一个容器对象,其值可以更改。
例如,您可以使用AtomicInteger
:
AtomicInteger x = new AtomicInteger(30);
AtomicInteger y = x;
y.set( 40 );
System.out.println(x.get());
答案 1 :(得分:1)
你做不到。虽然Integer
不是原始数据类型,而是围绕int
基元类型的包装类,但您的代码等同于:
Integer y = x;
y = new Integer(40);
所以你实际上是将对象y
更改为。此机制称为自动装箱。有一个简单的经验法则:为了改变对象的状态,而不是替换整个对象,你必须调用一个对象的方法。表示 values 的类(例如数字)通常不提供此类方法,而是要求将对象替换为表示新值的新对象。
答案 2 :(得分:0)
第二个代码块中发生的情况是30
被装入整数并分配给x
。然后将同一个整数分配给y
。 x和y现在指向同一个对象。但是当你执行y = 40
时,40会被装入一个新的Integer对象并被分配给y。 Integer类是不可变的,您将无法在创建后更改其值。