Nead làm rõ cho mã sau:
StringBuilder sample = new StringBuilder();
StringBuilder referToSample = sample;
referToSample.append("B");
System.out.println(sample);
Điều này sẽ in ra B
để chứng minh sample
và referToSample
các đối tượng tham chiếu đến cùng một tham chiếu bộ nhớ.
StringBuilder sample = new StringBuilder();
StringBuilder referToSample = sample;
sample.append("A");
referToSample.append("B");
System.out.println(referToSample);
Điều này sẽ in AB
ra cũng chứng minh điều tương tự.
StringBuilder sample = new StringBuilder();
StringBuilder referToSample = sample;
referToSample = null;
referToSample.append("A");
System.out.println(sample);
Rõ ràng điều này sẽ ném NullPointerException
bởi vì tôi đang cố gắng gọi append
một tham chiếu rỗng.
StringBuilder sample = new StringBuilder();
StringBuilder referToSample = sample;
referToSample = null;
sample.append("A");
System.out.println(sample);
Vì vậy, đây là câu hỏi của tôi, tại sao mẫu mã cuối cùng không ném ra NullPointerException
bởi vì những gì tôi thấy và hiểu được từ hai ví dụ đầu tiên là nếu hai đối tượng tham chiếu đến cùng một đối tượng thì nếu chúng ta thay đổi bất kỳ giá trị nào thì nó cũng sẽ phản ánh sang đối tượng khác vì cả hai đều trỏ đến cùng một tham chiếu bộ nhớ. Vậy tại sao quy tắc đó không được áp dụng ở đây? Nếu tôi gán null
cho referenceToSample thì mẫu cũng phải là null và nó sẽ ném NullPointerException nhưng nó không ném một cái, tại sao?
sample
vẫn cònsample
. Bạn chỉ thay đổireferToSample
.