2014-12-15 17 views
41

Trình biên dịch không phàn nàn khi tôi viết mã sau đây?Biến riêng tư này có thể truy cập được bằng cách nào?

public class MyClass 
{ 
    private int count; 

    public MyClass(int x){ 
     this.count=x; 
    } 

    public void testPrivate(MyClass o){ 
     System.out.println(o.count); 
    } 
} 

Mặc dù nó là một thể hiện của cùng lớp, trong đó testPrivate được viết, không nên nó đưa ra một lỗi biên dịch tại System.out.println(o.count)? Sau khi tất cả, tôi đang cố gắng truy cập một biến riêng trực tiếp.
Mã thậm chí chạy tốt.

+2

Lớp MyClass biết biến số đếm, do đó, không có vấn đề – SaintLike

+18

Riêng tư cho lớp học, không phải là cá thể. Java không cố gắng ngăn bàn tay trái của bạn đánh vào tay phải của bạn. ;) –

+0

Tạo thông qua Eclipse hoặc IDEA hashCode và bằng phương pháp, chúng luôn luôn theo cách đó – Maksym

Trả lời

56

Một thành viên riêng có thể truy cập từ bất kỳ phương thức nào trong lớp được khai báo, bất kể phương thức đó có truy cập thành viên riêng của cá thể của cá thể hay cá thể của cá thể khác của cá thể hay không (this).

Điều này được nêu trong JLS 6.6.1:

... Ngược lại, nếu các thành viên hoặc constructor được khai báo là private, sau đó truy cập được phép khi và chỉ khi nó xảy ra trong cơ thể của lớp cấp cao nhất (§ 7.6) bao quanh tuyên bố của thành viên hoặc nhà xây dựng.

Tính năng này của Java cho phép bạn viết các phương pháp mà chấp nhận một thể hiện của lớp như một đối số (ví dụ - clone(Object other), compareTo(Object other)) mà không dựa vào các lớp có thu khí không tin cho tất cả các thuộc tính riêng cần được truy cập.

+1

TBH, tôi đã không ý thức được điều đó, nhưng nó thực sự được liệt kê một cách rõ ràng như là một báo trước cho riêng tư trong Java tome trên bàn của tôi (Liệt kê 9.6 trên trang 200 trong Krüger, Hansen: "Handbuch der Java-Programmierung", Addison -Wesley, 2012). Không có đề cập ở cái nhìn đầu tiên trong Venners '"Bên trong máy ảo JAVA", tho. Cảm ơn câu hỏi và câu trả lời. – hiergiltdiestfu

+0

Cảm ơn bạn, nó có ý nghĩa bây giờ. Tôi đã luôn luôn sử dụng 'compareTo' và' equals' với getters. Thật lạ lùng khi tôi nhận thấy chúng ta có thể truy cập nó mà không cần đến getters nữa. –

12

Các trường riêng tư là riêng tư cho toàn bộ lớp học, không chỉ cho đối tượng.

Các lớp khác không biết rằng MyClass có trường được gọi là số đếm; tuy nhiên, đối tượng MyClass biết rằng một đối tượng MyClass khác có trường đếm.

+0

bổ sung tốt đẹp và chỉ cần giải thích tôi cần –

0

Phương thức, Biến và Constructors được khai báo riêng tư chỉ có thể được truy cập trong chính lớp đã khai báo. Kiểm tra official documentation

3

Mặc dù nó là thể hiện của cùng lớp, trong đó testPrivate được bằng văn bản, nhưng không nên nó thông qua một lỗi biên dịch tại System.out.println (o.count);

Không. Nó sẽ không bao giờ ném một lỗi biên dịch.

Điều này tương tự như những gì một trình rút gọn đơn giản và trình thiết lập thực hiện hoặc một hàm tạo bản sao. Hãy nhớ rằng chúng có thể truy cập private thành viên sử dụng this.

public MyClass { 
    private String propertyOne; 
    private String propertyTwo; 

    // cannot access otherObject private members directly 
    // so we use getters 
    // But MyClass private members are accessible using this. 
    public MyClass(OtherClass otherObject) { 
     this.propertyOne = otherObject.getPropertyOne(); 
     this.propertyTwo = otherObject.calculatePropertyTwo(); 
    } 

    public void setPropertyOne(String propertyOne) { 
     this.propertyOne = propertyOne; 
    } 

    public String getPropertyOne() { 
     return this.propertyOne; 
    } 
} 

phương pháp testPrivate bạn chấp nhận một thể hiện của MyClass. Vì testPrivate là một phương thức bên trong MyClass, nó sẽ có quyền truy cập vào private thuộc tính.

public void testPrivate(MyClass o) { 
     this.propertyOne = o.propertOne; 
    } 

Phương pháp định nghĩa bên trong lớp sẽ luôn luôn có quyền truy cập vào nó private thành viên, thông qua this. và biến ví dụ.

Nhưng nếu bạn xác định testPrivate ngoài số MyClass thì bạn sẽ không có quyền truy cập vào private thành viên.Ở đó bạn sẽ phải sử dụng một phương pháp hoặc một setter hoặc một getter.

6

Người truy cập không an toàn! Chúng được đóng gói, để giữ cho người khác không biết về mã.

Hãy xem xét nếu ai đó đã viết Quantum Bogo Sort, nhưng biến mất khi anh ấy quashed lỗi cuối cùng - hiểu mã sẽ khiến một người bị xóa khỏi vũ trụ hoặc phát điên.

Mặc dù hạn chế nhỏ này, nếu được đóng gói đúng cách, điều này sẽ trở thành thuật toán phân loại ưa thích của bạn, vì tất cả các trường và phương thức ngoại trừ Sắp xếp phải riêng tư.

Bạn không biết cách thức hoạt động và bạn không muốn biết cách hoạt động, nhưng nó hoạt động và điều đó là đủ. Nếu mặt khác, mọi thứ đều công khai, và bạn phải hiểu cách nó làm những gì nó làm để sử dụng nó một cách chính xác - đó chỉ là để làm phiền nhiều, tôi sẽ gắn bó với quicksort.

Các vấn đề liên quan