อาจมีการอ้างอิงโดยการจัดเก็บที่อยู่ โดยปกติแล้วการอ้างอิง Java จะถูกนำไปใช้เป็นตัวชี้ พวกเขาอาจใช้เลเยอร์ทางอ้อมเพิ่มเติมเพื่อให้สามารถรวบรวมขยะได้ง่ายขึ้น แต่ในที่สุดแล้วมันก็จะถูกต้มเกือบถึงตัวชี้ (C-style) ที่เกี่ยวข้องในการดำเนินการอ้างอิง (Java-style)
คุณไม่สามารถใช้ตัวชี้ทางคณิตศาสตร์พร้อมการอ้างอิงได้ ความแตกต่างที่สำคัญที่สุดระหว่างตัวชี้ใน C และการอ้างอิงใน Java คือคุณไม่สามารถไปถึง (และปรับเปลี่ยน) ค่าพื้นฐานของการอ้างอิงใน Java กล่าวอีกนัยหนึ่ง: คุณไม่สามารถใช้เลขคณิตของตัวชี้ได้
ใน C คุณสามารถเพิ่มบางสิ่งลงในตัวชี้ (เช่นที่อยู่) หรือแทนที่บางสิ่งบางอย่างเพื่อชี้ไปยังสิ่งที่เป็น "ใกล้เคียง" หรือชี้ไปยังสถานที่ที่อยู่ในสถานที่ใดก็ได้
ใน Java การอ้างอิงชี้ไปที่สิ่งหนึ่งและสิ่งนั้นเท่านั้น คุณสามารถทำให้ตัวแปรมีการอ้างอิงที่แตกต่างกันแต่คุณไม่สามารถขอให้ชี้ไปที่ "สิ่งที่อยู่หลังสิ่งที่เป็นต้นฉบับ"
การอ้างอิงจะถูกพิมพ์อย่างยิ่ง แตกต่างก็คือว่าประเภทของการอ้างอิงเป็นมากการควบคุมอย่างเคร่งครัดมากขึ้นในชวากว่าชนิดของตัวชี้อยู่ในซีใน C คุณสามารถมีint*
และโยนมันทิ้งไปchar*
และเพียงแค่ re-ตีความหน่วยความจำที่ตำแหน่งนั้น การตีความอีกครั้งนั้นใช้ไม่ได้ใน Java: คุณสามารถตีความวัตถุที่ส่วนท้ายของการอ้างอิงเป็นสิ่งที่มันมีอยู่แล้ว (เช่นคุณสามารถส่งการObject
อ้างอิงไปยังString
การอ้างอิงได้ก็ต่อเมื่อวัตถุที่ชี้ไปนั้นเป็นจริงString
)
ความแตกต่างเหล่านั้นทำให้พอยน์เตอร์ C ทรงพลังกว่า แต่ก็อันตรายกว่าเช่นกัน ทั้งความเป็นไปได้เหล่านั้น (ตัวชี้ทางคณิตศาสตร์และการตีความค่าที่ชี้ไป) เพิ่มความยืดหยุ่นให้กับ C และเป็นแหล่งที่มาของพลังของภาษา แต่พวกเขายังมีแหล่งใหญ่ของปัญหาเพราะถ้าใช้ไม่ถูกต้องก็สามารถทำลายสมมติฐานว่ารหัสของคุณจะถูกสร้างขึ้นรอบ ๆ และมันค่อนข้างง่ายต่อการใช้งานอย่างไม่ถูกต้อง