Chỉ 2 xu của tôi cho câu hỏi tại sao ngữ nghĩa của khả năng hiển thị riêng tư trong Java là cấp lớp chứ không phải cấp đối tượng.
Tôi có thể nói rằng sự tiện lợi dường như là chìa khóa ở đây. Trên thực tế, khả năng hiển thị riêng tư ở mức đối tượng sẽ buộc phải hiển thị các phương thức cho các lớp khác (ví dụ trong cùng một gói) trong kịch bản được minh họa bởi OP.
Trong thực tế, tôi không thể hiểu và cũng không thể tìm thấy một ví dụ cho thấy rằng khả năng hiển thị ở cấp độ lớp riêng tư (như được cung cấp bởi Java) tạo ra bất kỳ vấn đề nào nếu so sánh với khả năng hiển thị ở cấp độ đối tượng-riêng.
Điều đó nói rằng, các ngôn ngữ lập trình có hệ thống chính sách khả năng hiển thị chi tiết hơn có thể đủ khả năng hiển thị đối tượng ở cấp đối tượng và cấp lớp.
Ví dụ: Eiffel , cung cấp tính năng xuất có chọn lọc: bạn có thể xuất bất kỳ đối tượng địa lý nào của lớp sang bất kỳ lớp nào bạn chọn, từ {NONE} (đối tượng-riêng tư) đến {ANY} (tương đương với công khai và cũng là mặc định), sang {PERSON} (lớp-riêng tư, xem ví dụ của OP), cho các nhóm lớp cụ thể {PERSON, BANK}.
Cũng rất thú vị khi nhận xét rằng trong Eiffel, bạn không cần đặt một thuộc tính là riêng tư và viết một getter để ngăn các lớp khác gán cho nó. Các thuộc tính công khai trong Eiffel theo mặc định có thể truy cập ở chế độ chỉ đọc, vì vậy bạn không cần getter chỉ để trả lại giá trị của chúng.
Tất nhiên, bạn vẫn cần một setter để đặt một thuộc tính, nhưng bạn có thể ẩn nó bằng cách xác định nó là "người gán" cho thuộc tính đó. Điều này cho phép bạn, nếu bạn muốn, sử dụng toán tử gán thuận tiện hơn thay vì lời gọi setter.