Java có một công cụ sửa đổi truy cập được bảo vệ riêng tư của Wikipedia không?


160

Tôi đã thấy một số tài liệu tham khảo đề cập đến một công cụ sửa đổi truy cập trong Java được gọi là private protected(cả hai từ cùng nhau):

private protected someMethod() {

}

Một trong những trang tôi tìm thấy đề cập đến điều này là ở đây . Bài học ở trường của tôi cũng đề cập đến công cụ sửa đổi truy cập này (và cho biết nó tồn tại). Tuy nhiên, việc sử dụng nó dẫn đến một lỗi trong ngôn ngữ Java.

Tôi đã thử với cả hai biến và phương thức và tôi khá chắc chắn rằng nó không tồn tại, nhưng tôi muốn một lời giải thích về những gì đã xảy ra. Được xem xét, sau đó từ chối? Hay nó đã bị xóa trong một phiên bản Java mới hơn?

Chỉnh sửa: Tôi không tìm kiếm thông tin về protectedtừ khóa.


60
Trang bạn tìm thấy đặt tiêu đề HTTP "Sửa đổi lần cuối" của: Thứ Hai, ngày 26 tháng 2 năm 1996 18:14:04 GMT!
G. Sylvie Davies

6
@Joe Tôi là tất cả để đóng các câu hỏi dưới dạng lừa đảo khi có thể, nhưng tôi không thấy bất cứ điều gì về một công cụ private protectedsửa đổi kết hợp trong đó.
jpmc26

2
@ jpmc26 Xem "Trong Java 1.0 có một công cụ sửa đổi truy cập bổ sung, được bảo vệ riêng tư." Tuy nhiên, câu trả lời ở đây là một bản tóm tắt tốt hơn nhiều về lịch sử.
Joe

2
@Joe Thực sự có một tài liệu tham khảo private protectedtrong câu trả lời đó, nhưng nó không giải thích tại sao hoặc điều gì đã xảy ra với nó, câu hỏi này là về cái gì.
m0skit0

3
Có ai khác thấy đáng sợ khi OP học điều này ở trường .... hơn 20 năm sau khi nó bị xóa khỏi Docs? Bài học lịch sử thú vị, nhưng vẫn hơi đáng sợ khi mọi người đang học thứ gì đó đã bị xóa trước khi Java 1 được đặt tên ...
Xaolingbao

Câu trả lời:


191

Loại bỏ các sửa đổi truy cập

Java ban đầu có bộ private protectedsửa đổi, nhưng nó đã bị xóa trong JDK 1.0.2 ( phiên bản ổn định đầu tiên , Java 1.0 mà chúng ta biết ngày nay). Một vài hướng dẫn về JDK 1.0.2 ( ở đâyở đây ) nói như sau:

Lưu ý: Bản phát hành 1.0 của ngôn ngữ Java hỗ trợ năm cấp truy cập: bốn cấp được liệt kê ở trên cộng private protected. Mức private protectedtruy cập không được hỗ trợ trong các phiên bản Java cao hơn 1.0; bạn không nên sử dụng nó trong các chương trình Java của mình nữa.

Một câu trả lời khác trên SoftwareEngineering.SE nêu rõ:

Java ban đầu có một sửa đổi như vậy. Nó đã được viết private protectednhưng bị xóa trong Java 1.0.

Bây giờ hãy xem Lịch sử Phiên bản Java :

JDK 1.0

Phiên bản đầu tiên được phát hành vào ngày 23 tháng 1 năm 1996 và được gọi là Oak. Phiên bản ổn định đầu tiên, JDK 1.0.2, được gọi là Java 1.

Từ đó, chúng ta có thể kết luận các hướng dẫn về phiên bản 1.0.2 đề cập đến phiên bản đầu tiên, JDK 1.0, trong đó ngôn ngữ được gọi là Oak, nhưng ngôn ngữ từ SoftwareEngineering.SE đề cập đến phiên bản ổn định đầu tiên, JDK 1.0.2 được gọi là Java 1.0, nơi nó đã được gỡ bỏ.

Bây giờ nếu bạn cố gắng tìm kiếm nó trong tài liệu Java 1.0 , bạn sẽ không tìm thấy nó, vì như đã đề cập trước đó, nó đã bị xóa trong JDK 1.0.2, còn được gọi là Java 1.0. Điều này được chứng minh một lần nữa khi bạn nhìn vào lần "Sửa đổi lần cuối" cho liên kết bạn đã đăng. Liên kết bạn đã đăng được sửa đổi lần cuối vào tháng 2 năm 1996. Java 1.0 / JDK 1.0.2, khi private protectedbị xóa, được phát hành sau tháng 2 năm 1996 và theo đặc tả, tháng 8 năm 1996.

Lý do để loại bỏ

Một số nguồn cũng giải thích lý do private protected, chẳng hạn như cái này . Để trích:

Những gì đã được bảo vệ tư nhân?

Ban đầu, ngôn ngữ Java cho phép một số tổ hợp sửa đổi nhất định, một trong số đó là private protected. Ý nghĩa của private protectedviệc giới hạn tầm nhìn nghiêm ngặt đối với các lớp con (và loại bỏ quyền truy cập gói). Điều này sau đó được coi là hơi không nhất quán và quá phức tạp và không còn được hỗ trợ. [5]

[5] Ý nghĩa của công cụ protectedsửa đổi đã thay đổi trong bản phát hành Beta2 của Java và sự private protectedkết hợp xuất hiện cùng một lúc. Họ đã vá một số lỗ hổng bảo mật tiềm năng, nhưng khiến nhiều người bối rối.

Và SoftwareEngineering.SE cũng hỗ trợ điều này, bằng cách nói rằng nó không xứng đáng với sự không nhất quán và độ phức tạp thêm, vì vậy nó đã bị xóa sớm.

Diễn dịch

Giải thích của tôi về tất cả những điều này là có lẽ, trở lại thời Oak, cả hai đều được phép cùng tồn tại (do đó là sự kết hợp). Vì protectedý nghĩa của nó đã thay đổi 1 , có thể cần phải cho phép privateprotectedđồng thời. Phần giới thiệu trở nên quá phức tạp và không có giá trị, và cuối cùng đã bị loại bỏ. Vào thời điểm Java 1.0 / JDK 1.0.2 xuất hiện, nó đã bị loại bỏ và do đó không thể tìm thấy trong tài liệu này.


1 Trong Đặc tả ngôn ngữ Oak , Phần 4.10, Truy cập các biến và phương thức , lưu ý rằng công cụ sửa đổi mặc định là protected:

Theo mặc định, tất cả các biến và phương thức trong một lớp được bảo vệ .

Điều này khá khác với những gì chúng ta có ngày nay, truy cập gói mặc định. Điều này có thể đã mở đường cho nhu cầu private protected, bởi vì privatequá hạn chế và protectedquá khoan dung.


Tôi chắc chắn rằng nó không đáng bao nhiêu - nhưng tôi nhớ khi nó xảy ra (tôi đã lập trình khi còn bé và rất thích điều Java mới này) và trong khi tôi không thể tìm thấy bất kỳ nguồn gốc nào - tôi nhớ mọi thứ chính xác như thế này khi tôi theo dõi họ
Benjamin Gruenbaum

Early on, the Java language allowed for certain combinations of modifiers, Điều đó có nghĩa là không chỉ có "Bảo vệ tư nhân?"
Xaolingbao

@Xaoling Agoda Tất nhiên, một người truy cập giống như không có tài khoản :) Các liên kết được cung cấp sẽ làm rõ câu hỏi của bạn.
m0skit0

52

Có những câu chuyện khó hiểu / không rõ ràng:

Một, từ nguồn Princeton mà bạn đặt, và cũng từ tài liệu lưu trữ của MIT , nói rằng:

Lưu ý: Bản phát hành 1.0 của ngôn ngữ Java hỗ trợ năm cấp truy cập: bốn mức được liệt kê ở trên cộng với bảo vệ riêng tư. Mức truy cập được bảo vệ riêng tư không được hỗ trợ trong các phiên bản Java cao hơn 1.0; bạn không nên sử dụng nó trong các chương trình Java của mình nữa.

Nhưng tính năng này không được chỉ định trên bất kỳ tài liệu chính thức nào cho Java 1.0 tại đây hoặc tại đây .

Tôi đoán là tính năng này không được đưa lên phiên bản 1.0 chính thức, vì đặc tả ngôn ngữ chính thức là từ tháng 8 năm 1996 và nguồn Princeton được sửa đổi lần cuối vào tháng 2 năm 1996 .

PS: xấu hổ về Oracle vì đã xóa tài liệu lưu trữ cho các phiên bản cũ hơn.


vậy liên kết của tôi có phải là phiên bản cũ hơn của cùng một nội dung không? : D

Có thể thông tin còn thiếu có liên quan đến ghi chú mà bạn đặt.

@AndrewLi Không nơi nào được nêu là ổn định trên các tham chiếu đã cho. Và thật khó hiểu khi gọi 1.0.2 là 1.0 khi có 1.0 thực tế.
m0skit0

10

Vì liên kết bạn cung cấp trong câu hỏi của bạn gợi ý private protectedđã được sử dụng trên element/membermột lớp, khi bạn muốn bạn subclasscó thể truy cập phần tử nhưng giữ ẩn nó khỏi các lớp khác trong lớp package.

Javanếu được so sánh với C++một khái niệm bổ sung về các yếu tố đóng gói - và đó là Gói . Người ta cũng nên hiểu những gì có thể truy cập trong hoặc ngoài gói Javakhi nói đến các công cụ truy cập này như private, public& protected.

Xin lưu ý rằng tôi đã giải thích lý do tại sao nó được sử dụng. Tất nhiên không phải trong phiên bản hiện tại


Liên kết của tôi là để truy cập phương pháp. Không truy cập thành viên.

1
@MarkYisri cũng có thể được sử dụng cho các biến thành viên. truy cập specifier không chỉ hoạt động trên các phương thức mà còn trên các vars thành viên. Nói cách khác, các chỉ định truy cập là một khái niệm đóng gói & không liên quan đến việc bạn áp dụng nó trên các phương thức thành viên hay các biến thành viên. áp dụng cho hầu hết tất cả các ngôn ngữ hướng đối tượng, bao gồm C ++ & java
lập trình

Được rồi, nhưng hướng dẫn (thú vị) không đề cập đến riêng tư được bảo vệ trên các biến. Giữ và để tôi xem nếu có trang biến ...


0

Không, bạn không thể sử dụng cả privatemột protectedvới nhau. Hướng dẫn của bạn là lạ. Những gì bạn có được gọi là gói riêng tư hoặc trong gói tham chiếu ot6 được bảo vệ quyền truy cập. Đây là quyền truy cập mặc định được bật khi không có vòng loại acc6 được viết rõ ràng.


3
Tôi biết bạn không thể sử dụng nó. Tôi muốn biết những gì đã xảy ra với nó, mà các câu trả lời khác giải thích tốt hơn.

4
Chà, liên kết là từ năm 1996 do việc phát triển Java mới chỉ bắt đầu khoảng một năm trước, nội dung của liên kết không thực sự lạ lẫm: D
Keiwan

6
Điểm tốt về ngày của tài liệu theach. Tôi đã trả lời câu hỏi trong khi tàu myou đến và viết nó bằng điện thoại, rất xin lỗi nếu câu trả lời không đủ trật bánh. Chỉ muốn giúp đỡ ...
AlexR

6
@AlexR lỗi chính tả của bạn trật bánh thực sự là một cách chơi chữ (xe lửa). Chỉ cần chú ý. : D

1
@MarkYisri, chi tiết. Viết bằng điện thoại không phải là cách tốt nhất để đăng câu trả lời trên SO.
AlexR

-2

Phạm vi riêng tư đang héo tàn với lớp hiện có. Trong đó Protected có thể được truy cập trong gói và lớp được mở rộng bởi các lớp trong các gói khác.

Liền mạch nếu bạn muốn biến / phương thức của bạn được truy cập bên ngoài gói bạn cần xác định là được bảo vệ / công khai nếu không riêng tư hoặc một số chỉ định truy cập khác.

Các phương thức được bảo vệ thường có thể truy cập được từ gói bên ngoài và trong các lớp con, tức là một lớp phải mở rộng lớp tương ứng để tận dụng các phương thức được xác định được bảo vệ.

Các phương thức / biến riêng có phạm vi trong lớp. Chúng không thể truy cập bên ngoài lớp.

Do đó, bạn không thể xác định Private Protected cùng một lúc!


Điều này đã không trả lời câu hỏi. Tôi hỏi tại sao nó không hoạt động. Các câu trả lời khác làm tốt hơn nhiều việc trả lời câu hỏi.

Để làm rõ hơn, tôi biết nó không còn hoạt động nữa, nhưng các câu trả lời khác giải thích tại sao và những gì đã xảy ra trong quá khứ. Bạn không.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.