执行以下代码时,我对类型包装器的不可变性感到困惑
static void inc(Integer nr)
{
System.out.printf("1. inc() \t %d \n", nr);
nr++;
System.out.printf("2. inc() \t %d \n", nr);
} // inc()
public static void main(String[] args)
{
Integer nr1 = 10;
System.out.printf("a. main() \t %d \n", nr1);
inc(nr1);
System.out.printf("b. main() \t %d \n", nr1);
} // main()
执行它会创建以下输出
a. main() 10
1. inc() 10
2. inc() 11
b. main() 10
如果类型包装器是不可变的,那么为什么行“1.inc”和“2.inc”之间的值会增加 行“b.main”打印的值是否与“1.main”相同?
谢谢
克里斯
最佳答案
If a type wrapper is immutable, why then is the value increased between line "1. inc" and "2. inc"
因为你实际上并没有改变现有的 Integer 对象 - 你正在创建一个新的对象(嗯,有效 - 实际上它会使用常见的缓存对象,但重点是值nr
将引用 nr++
之后的不同对象)。想一想:
nr++;
作为替代:
int tmp = nr.intValue();
tmp++;
nr = Integer.valueOf(tmp);
因此,您看到 nr
的文本表示形式发生变化并不意味着它所引用的对象已发生变化 - 在本例中,原因是 nr
> 本身具有新的值,引用不同的对象。
您也可以通过更多诊断来看到这一点:
static void inc(Integer nr)
{
Integer original = nr;
System.out.printf("1. inc() \t %d \n", nr);
nr++;
System.out.printf("2. inc() \t %d \n", nr);
// This will print 10
System.out.printf("Original: %d\n", original);
}
and does line "b. main" print the same value as "1. main"?
一如既往,引用按值传递。这意味着 inc(nr1)
根本不会修改 nr1
- 它引用之前所做的同一个对象。正如我上面所说, inc
also 不会修改对象(因为包装器类型是不可变的)。因此,在调用之后,nr1
引用包装相同值 (10) 的同一对象。
关于java - 不可变类型包装器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30941854/