2012-10-12 31 views
5

Tôi có một số nghi ngờ về số nhận dạng được bảo vệ. Trong chương đầu tiên của Hướng dẫn học lập trình Java được chứng nhận bởi K.Sierra tôi đã tìm thấy các thông tin sau:Hành vi thành viên được bảo vệ khi nó được kế thừa.

"Khi phân lớp bên ngoài-gói thừa kế thành viên được bảo vệ, thành viên đó (được thừa kế bởi lớp con) trở thành riêng tư đối với bất kỳ mã nào bên ngoài lớp con, ngoại trừ các lớp con của lớp con. "

Tôi đã cung cấp mã mẫu phản ánh tuyên bố ở trên và điều đó hoàn toàn rõ ràng đối với tôi.

// Parent class 
package package1; 

import package2.Child; 
public class Parent { 

    protected int i = 5; 

} 

// Child class 
package package2; 

import package1.Parent; 

public class Child extends Parent { 

    // variable 'i' inherited 

} 


package package2; 

public class Neighbour { 

    public void protectedTesting(){ 
     Child child = new Child(); 
     System.out.println(child.i); // no access 
    } 
} 

Tôi đã bắt đầu thử nghiệm và thực hiện một thay đổi nhỏ - di chuyển hàng xóm sang gói1. Và có quyền truy cập vào "i" biến mà là một chút ngạc nhiên đối với tôi vì nó không phù hợp với tuyên bố "trở thành tin tới bất kỳ mã bên ngoài lớp con" class

Neighbor sau khi thay đổi:

package package1; 

import package2.Child; 

public class Neighbour { 

    public void protectedTesting(){ 
     Child child = new Child(); 
     System.out.println(child.i); // access! 
    } 
} 

Hãy làm rõ với tôi. Cảm ơn.

Trả lời

5

Tóm lại, protected là gói riêng tư cũng như hiển thị với các lớp con. Ngay cả những JLS là mơ hồ về vấn đề này (JLS §6.6.2):

Một thành viên protected hoặc constructor của một đối tượng có thể được truy cập từ bên ngoài gói trong đó nó được tuyên bố chỉ cho phép code đó là chịu trách nhiệm về việc thực hiện của đối tượng đó.

Chỉ định rằng bên ngoài gói, chỉ các lớp con mới có thể truy cập các thành viên được bảo vệ. Điều này ngụ ý mà bạn cũng có thể truy cập biến trong gói. Đó là từ ngữ nghèo nàn, nhưng dù sao thì các thành viên được bảo vệ vẫn có mức hiển thị mức gói cũng như hiển thị mức độ hiển thị cấp lớp con là.

Xem thêm:

+0

Câu trả lời chi tiết và giải thích. – MrKiller21

1

Sự thật không có trong "Sun Certified Java Programmer Study Guide" nhưng trong Java Language Specification

6.6.2. Thông tin chi tiết về bảo vệ Access

Thành viên hoặc nhà xây dựng được bảo vệ của một đối tượng có thể truy cập từ bên ngoài gói mà nó được khai báo chỉ bằng mã là chịu trách nhiệm thực hiện đối tượng đó.

+0

Đúng là SCJPSG không dứt khoát. Tuy nhiên, điều đó không làm cho nó không chính xác. Xem câu trả lời của Nandkumar Tekale. –

+0

"Khi phân lớp-bên ngoài-gói thừa hưởng thành viên được bảo vệ, thành viên đó (được thừa kế bởi lớp con) trở thành riêng đối với MỌI MÃ bên ngoài phân lớp" - Cá nhân, tôi thấy nó không chính xác và gây hiểu nhầm. – MrKiller21

3

Và có quyền truy cập vào "i" biến mà là một chút ngạc nhiên đối với tôi vì nó không phù hợp với tuyên bố "trở thành riêng tư đối với bất kỳ mã nào bên ngoài lớp con"

-> Nhưng bạn chuyển lớp Neighbour trong gói package1 đó là đúng theo "Protected members can be accessed by classes in same package"

"Một khi các lớp con-ngoài-the-gói được thừa hưởng những thành viên bảo vệ, thành viên đó (như thừa hưởng bởi các lớp con) trở thành riêng tư đối với bất kỳ mã nào bên ngoài lớp con, ngoại trừ các lớp con của lớp con. "

-> Gói bên trong nó vẫn được bảo vệ và không riêng tư cho tất cả các lớp trong gói.

+1

+1 - để giải thích lý do tại sao hành vi được quan sát bởi OP thực sự là * phù hợp * với sách của K.Sierra. –

1

protected khả năng hiển thị bao gồm khả năng hiển thị mức gói. Thừa kế cho phép bạn xem đối tượng Child của mình dưới dạng phiên bản Parent. Là thành viên i của Parent được khai báo trong cùng một gói, có thể truy cập từ Neighbour.

package package1; 

import package2.Child; 

public class Neighbour { 

    public void protectedTesting() { 
     Parent neighboured = new Child(); 
     System.out.println(neighboured.i); // access 
    } 
} 
Các vấn đề liên quan