Tài liệu tham khảo có thể được thực hiện bằng cách lưu trữ địa chỉ. Thông thường các tham chiếu Java sẽ được triển khai như các con trỏ, nhưng điều đó không bắt buộc bởi đặc tả. Họ có thể đang sử dụng một lớp bổ sung bổ sung để cho phép thu gom rác dễ dàng hơn. Nhưng cuối cùng, nó sẽ (hầu như luôn luôn) sôi sục với các con trỏ (kiểu C) có liên quan đến việc thực hiện các tham chiếu (kiểu Java).
Bạn không thể làm số học con trỏ với các tài liệu tham khảo. Sự khác biệt quan trọng nhất giữa một con trỏ trong C và một tham chiếu trong Java là bạn thực sự không thể lấy (và thao tác) giá trị cơ bản của một tham chiếu trong Java. Nói cách khác: bạn không thể thực hiện số học con trỏ.
Trong C, bạn có thể thêm một cái gì đó vào một con trỏ (tức là địa chỉ) hoặc trừ thứ gì đó để trỏ đến những thứ "gần đó" hoặc trỏ đến các địa điểm ở bất kỳ nơi nào .
Trong Java, một tham chiếu chỉ đến một điều và chỉ điều đó. Bạn có thể làm cho một biến giữ một tham chiếu khác , nhưng bạn không thể yêu cầu nó chỉ ra "điều sau điều ban đầu".
Tài liệu tham khảo được đánh máy mạnh mẽ. Khác biệt nữa là các loại tài liệu tham khảo được nhiều kiểm soát chặt chẽ hơn trong Java so với loại một con trỏ trong C. Trong C bạn có thể có một int*
và bỏ nó vào một char*
và chỉ tái diễn dịch bộ nhớ tại địa điểm đó. Việc giải thích lại đó không hoạt động trong Java: bạn chỉ có thể diễn giải đối tượng ở đầu kia của tham chiếu như một cái gì đó đã có (tức là bạn chỉ có thể chuyển một Object
tham chiếu đến String
tham chiếu nếu đối tượng được trỏ thực sự là a String
).
Những khác biệt đó làm cho con trỏ C mạnh hơn, nhưng cũng nguy hiểm hơn. Cả hai khả năng đó (số học con trỏ và diễn giải lại các giá trị được trỏ đến) thêm tính linh hoạt cho C và là nguồn gốc của một số sức mạnh của ngôn ngữ. Nhưng chúng cũng là nguồn gây ra vấn đề lớn, bởi vì nếu sử dụng không đúng cách, chúng có thể dễ dàng phá vỡ các giả định rằng mã của bạn được xây dựng xung quanh. Và thật dễ dàng để sử dụng chúng không chính xác.