คำชี้แจงสำหรับรหัสต่อไปนี้:
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 ตัวอย่างก็ควรเป็นโมฆะด้วยและควรโยน NullPointerException แต่ไม่ได้โยนไปทำไม?




sampleยังsampleอยู่referToSampleคุณเปลี่ยนแปลงเท่านั้น