需要澄清以下代码:
StringBuilder sample = new StringBuilder();
StringBuilder referToSample = sample;
referToSample.append("B");
System.out.println(sample);
这将打印B
,因此证明sample
和referToSample
对象引用相同的内存引用。
StringBuilder sample = new StringBuilder();
StringBuilder referToSample = sample;
sample.append("A");
referToSample.append("B");
System.out.println(referToSample);
这将打印出 AB
,这也证明了相同的事实。
StringBuilder sample = new StringBuilder();
StringBuilder referToSample = sample;
referToSample = null;
referToSample.append("A");
System.out.println(sample);
显然,这会抛出NullPointerException
,因为我试图在一个空引用上调用append
。
StringBuilder sample = new StringBuilder();
StringBuilder referToSample = sample;
referToSample = null;
sample.append("A");
System.out.println(sample);
所以我的问题是,为什么最后一个代码示例没有抛出NullPointerException
?因为从前两个示例中我所看到和理解的是,如果两个对象引用同一个对象,那么如果我们更改任何值,它也会反映到另一个对象上,因为两者都指向相同的内存引用。那么为什么这个规则在这里不适用呢?如果我将null
赋值给referToSample,则sample也应该为null,并且它应该抛出NullPointerException,但实际上它并没有抛出,为什么呢?
volatile
、final
、=``==
等)的运算符,当应用于对象变量时,会影响指针而不是它所引用的对象。 - MikeFHay