需要对以下代码进行澄清:
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
赋值给 refToSample,那么 sample 也应该为 null,它应该抛出一个 NullPointerException,但是它没有抛出一个,为什么?