2015-10-18 27 views
5

Tôi đã học được những điều sau đây từ sách Cốt lõi Java, Tập I - Nguyên tắc cơ bản (Phiên bản 8)> Chương 5: Phần thừa kế> phần 'Truy cập được bảo vệ' (Trang 205).Có thể một đối tượng của một trường con được truy cập vào trường được bảo vệ của đối tượng khác của một lớp con khác không?

Có lần, tuy nhiên, khi bạn muốn hạn chế một phương pháp để lớp con chỉ hay, ít phổ biến, cho phép các phương pháp phân lớp để truy cập một lĩnh vực lớp cha. Trong trường hợp đó, bạn khai báo tính năng của lớp là được bảo vệ. Ví dụ: nếu superclass Employee khai báo trường hợp thuêDay như được bảo vệ thay vì riêng tư, thì phương thức Manager có thể truy cập trực tiếp.

Tuy nhiên, các phương thức của lớp Người quản lý có thể nhìn trộm bên trong trường thuêDùng của đối tượng Trình quản lý chứ không phải đối tượng Nhân viên khác. Hạn chế này được thực hiện để bạn không thể lạm dụng cơ chế được bảo vệ và tạo các lớp con chỉ để truy cập vào các trường được bảo vệ.

Tôi đã viết mã sau để kiểm tra.

class Employee 
{ 
    protected String name; 

    public Employee(String name) { 
     this.name = name; 
    } 
} 

class Manager extends Employee 
{ 
    public Manager(String name) { 
     super(name); 
    } 

    public void peekName(Employee e) { 
     System.out.println("name: " + e.name); 
    } 
} 

class Executive extends Employee 
{ 
    public Executive(String name) { 
     super(name); 
    } 
} 

public class TestProtectedAccess 
{ 
    public static void main(String[] args) { 
     Employee e = new Employee("Alice Employee"); 
     Manager m = new Manager("Bob Manager"); 
     Executive ex = new Executive("Charles Executive"); 

     // Manager object accessing protected name of Employee object 
     m.peekName(e); 

     // Manager object accessing protected name of Executive object 
     m.peekName(ex); 
    } 
} 

Đầu ra của mã này là:

$ java TestProtectedAccess 
name: Alice Employee 
name: Charles Executive 

Đối tượng quản lý m có thể truy cập vào lĩnh vực bảo vệ name của người lao động khác đối tượng eex. Điều này dường như mâu thuẫn với những gì tôi đã trích dẫn ở trên từ cuốn sách, đặc biệt là phần mà tôi đã tô đậm.

Ai đó có thể giải thích cho tôi nếu sách sai hoặc hiểu sai của tôi không? Nếu sự hiểu biết của tôi sai, bạn có thể gợi ý một ví dụ tốt hơn để hiểu những gì cuốn sách có nghĩa là gì?

Trả lời

2

Vì các lớp học của bạn là tất cả trong cùng một gói, được bảo vệ giống như công khai.

Các modifier bảo vệ xác định rằng các thành viên chỉ có thể được truy cập trong gói riêng của mình (như với gói-tư nhân) và, ngoài ra, bởi một lớp con của lớp học trong một gói khác.

https://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html

+0

Có Bạn chắc chắn có thể làm điều đó. –

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