By Value ,By Reference

ฝากไว้ในนี้ก่อนละกัน เห็นกำลังฮิต แต่อยากจะอธิบายแยกออกมา เพราะเคยตั้งใจจะเขียนบล้อก เอาอันนี้แหละเป็นบล็อกแรกของปี

By Reference คำนี้ผมได้ยินจากภาษา c/c++ (ไม่แน่ใจละมันอยู่ใน c or c++) ส่วนหนึ่งผมคิดว่าเพราะว่ามันมี reference operator(&) และ dereference operator (*) ซึ่งในจาวาก็มี concept นี้เช่นกัน แต่ถูกกำจัดฟีเจอร์บางส่วนไว้เพื่อป้องกันความผิดพลาดของโปรแกรมเมอร์ (เช่น dereference จะเกิดอัตโนมัติเมื่อใช้ "." operator เพื่อเข้าถึง member ,บวกลบ pointer ไม่ได้)

อธิบาย

c++

int a =5;
int* ref_a = &a; // *ref_a เมื่อเป็น declaration statement มันจะเป็นการบอกว่าตัวแปร ref_a เป็นตัวแปรชนิด pointer to int ส่วน &a; คือการเอาค่า reference (address) ของ a
*ref_a = 10 ; // *ref_a ในกรณีนี้ทำหน้าที่เป็น dereference operator หมายถึง value ที่ ref_a อ้างอยู่จะมีค่าเท่ากับ 10 --- เมื่อ ref_a คือ ตัวแปรที่เก็บ address ดังนั้น *ref_a วึ่งก็คือ dereference ของ ref_a จึงหมายถึง value ของ ref_a ที่ชี้อยู่
*ref_a == a ; //อันนี้จึงเป็นจริง ตามข้างบน เนื่องจากว่า ref_a = &a มันอ้างถึง address เดียวกัน ดังนั้น ค่าที่อยู่ใน address เดียวกัน ย่อมเท่ากัน

ส่วนจาวา

Object a = new Object();
Object ref_a = a; // ref_a ชี้ไปที่เดียวกับ a ล้อกับ int *ref_a = &a; ต่างกันตรงที่ ref_a ของจาวาจะไม่ได้ชี้ไปที่ a แต่จะชี้ไปที่ instance
ref_a = new Student(); // ref_a  ชี้ไป new Student(); แต่ a ไม่เปลี่ยนตามเพราะจาวาไม่มี dereference operator ที่จะไปแก้ value ที่ตัวมันชี้อยู่ได้  มันจึงเทียบเท่า ref_a = &b  (สมมติว่ามี b) ของฝั่ง c++ ซึ่งก็หมายถึงเอา address ของ b มาใส่ใน ref_a

ผมเข้าใจว่านี่เป็นสาเหตุที่ให้หลายคนบอกว่า java pass by value เพราะถ้าเอาตาม c++ pass by reference จะแก้ค่าของตัวที่มันและตัวอื่นๆชี้อยู่ได้ด้วย dereference operator แต่จาวาไม่มี และก็ มันเอาค่าที่ ref hold อยู่ assign ต่อ ไม่ใช่ address ของตัวมันเอง

สดๆ จบ ปล เขียนตรงนี้เพราะ ไม่ได้เป็น writer และไม่ใช้ function อธิบาย เพราะลดความซับซ้อน