2010-06-30 48 views
6

Tôi đã tạo cá thể lớp cơ sở trong lớp dẫn xuất và cố gắng truy cập các thành viên được bảo vệ.java - các thành viên được bảo vệ được truy cập trong lớp dẫn xuất sử dụng cá thể lớp cơ sở

Tôi có thể truy cập trực tiếp các thành viên được bảo vệ trong lớp dẫn xuất mà không cần khởi tạo lớp cơ sở.

lớp Base:

package com.core; 

public class MyCollection { 

     protected Integer intg; 
} 

Một lớp học có nguồn gốc trong cùng một gói -

package com.core; 

public class MyCollection3 extends MyCollection { 

public void test(){ 

    MyCollection mc = new MyCollection(); 
    mc.intg=1; // Works 
} 
}

Một lớp học có nguồn gốc trong một gói khác nhau -

package secondary; 

import com.core.MyCollection; 

public class MyCollection2 extends MyCollection{ 

public void test(){ 
    MyCollection mc = new MyCollection(); 
    mc.intg = 1; //!!! compile time error - change visibility of "intg" to protected 
} 
} 

Làm thế nào chúng ta có thể truy cập một thành viên được bảo vệ của một lớp cơ sở trong một lớp dẫn xuất bằng cách sử dụng cá thể của lớp cơ sở khi lớp dẫn xuất cũng là trong s Ame gói nhưng không khi lớp dẫn xuất là trong gói khác nhau?

Nếu tôi đánh dấu thành viên được bảo vệ là "tĩnh" thì tôi có thể truy cập thành viên được bảo vệ của lớp cơ sở bằng cá thể lớp cơ sở trong lớp dẫn xuất nằm trong gói khác.

+0

thể trùng lặp của [Protected Java truy cập không làm việc] (http://stackoverflow.com/questions/332920/java-protected-access-not-working) --- Thực ra đó là sai lầm! Lấy làm tiếc! Điều này chắc chắn là một dupe mặc dù. – polygenelubricants

+0

đừng lo lắng, IDE của bạn sẽ không tạo ra bất kỳ sự khác biệt nào với câu hỏi vì đây là về ngữ nghĩa của chính ngôn ngữ Java. –

+0

có thể trùng lặp của [tại sao tôi không thể truy cập phương pháp java được bảo vệ ngay cả khi tôi đã mở rộng lớp học?] (Http://stackoverflow.com/questions/1622219/why-cant-i-access-protected-java-method -even-thought-ive-extended-the-class) – starblue

Trả lời

10

Bạn nói đúng là bạn không thể làm điều này. Lý do tại sao bạn không thể truy cập trường, là bạn không ở trong cùng một gói với lớp, cũng không phải bạn đang truy cập thành viên được thừa kế của cùng một lớp.

Điểm cuối cùng là quan trọng một - nếu bạn đã viết

MyCollection2 mc = new MyCollection2(); 
mc.intg = 1; 

thì đây sẽ làm việc, như bạn đang thay đổi thành viên bảo vệ của lớp của riêng bạn (mà hiện diện trong lớp đó thông qua kế thừa). Tuy nhiên, trong trường hợp của bạn, bạn đang cố gắng thay đổi thành viên được bảo vệ của một lớp khác nhau trong một gói khác. Vì vậy, nó sẽ đến như là không có gì ngạc nhiên khi bạn bị từ chối truy cập.

+0

Giải thích này rất dễ hiểu. Tôi đã xem xét đặc tả ngôn ngữ java và công cụ xây dựng của họ đã vượt qua đầu tôi !!! – Tarun

+0

@Tarun - nếu câu trả lời có hiệu quả với bạn, hãy đánh dấu nó là đã được chấp nhận (đánh dấu vào bên dưới bình chọn) – Bozho

+0

Tôi không biết tính năng này. Tôi sẽ đánh dấu nó như được trả lời ngay bây giờ. – Tarun

0

Theo quy tắc trợ năng thành viên của Java, bạn không thể truy cập thành viên được bảo vệ của một lớp mà không mở rộng nó.

Bạn có thể thử cách sau.

package secondary; 

import com.core.MyCollection; 

public class MyCollection2 extends MyCollection{ 

public void test(){ 
    intg = 1; 
} 
} 

Thay vì tạo phiên bản mới, hãy thử gán giá trị. Nó sẽ hoạt động.

+0

Đồng ý với lý do của bạn – Tarun

3

Các Java tutorial nói:

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 .

Và trong trường hợp của bạn, bạn đang truy cập biến trong đối tượng khác. Bởi trùng hợp ngẫu nhiên nó có một lớp học giống như hiện tại, nhưng kiểm tra khả năng hiển thị sẽ không kiểm tra điều đó.

Vì vậy, lần thứ hai bạn đang từ chối truy cập, bởi vì bạn đang ở trong một gói phần mềm khác nhau, và lần đầu tiên bạn được tiếp cận bởi vì bạn đang ở trong cùng một gói (và không phải vì đó là một lớp con)

+0

"lần đầu tiên bạn được cấp quyền truy cập vì bạn đang ở trong cùng một gói (và không phải vì nó là phân lớp)" Điều này làm rõ cho tôi. Cảm ơn. – Tarun

1

Trong ngắn, nó không thực sự có thể. Có vẻ như bạn nên xem xét lại thiết kế của mình.

Tuy nhiên, có một công việc xung quanh, nếu bạn chắc chắn đó là những gì bạn muốn làm. Bạn có thể thêm một bảo vệ phương pháp-MyCollection mà phải mất một ví dụ và đặt giá trị của intg thay cho bạn:

package com.core; 

public class MyCollection { 

    protected Integer intg; 

    protected void setIntg(MyCollection collection, Integer newIntg) { 
     collection.intg = newIntg; 
    } 
}

Bây giờ lớp con của bạn có thể truy cập vào phương pháp này:

package secondary; 

import com.core.MyCollection; 

public class MyCollection2 extends MyCollection{ 

    public void test(){ 
     MyCollection mc = new MyCollection(); 
     setIntg(mc, 1); 
    } 
}

Nhưng hãy lưu ý rằng đây là rất cách làm lạ. Tôi muốn đề nghị một lần nữa rằng thiết kế của bạn cần phải được suy nghĩ lại trước khi bạn đi xuống con đường này.

+0

Tôi nhận được quan điểm của bạn. Cách dễ dàng nhất đối với tôi là truy cập trực tiếp vào thành viên được bảo vệ hơn là tạo lớp cơ sở và truy cập nó trong một gói khác. Tôi đã làm điều đó "nhầm lẫn" trong khi chơi với java (không phải tôi nói tôi đã là một thử nghiệm manaul :-)) và sau đó không ai trong số thành viên dev của tôi đã có thể cung cấp cho tôi câu trả lời có thể hiểu được. Vì vậy, tôi đăng nó ở đây. – Tarun

0

Bạn không thể truy cập biến được bảo vệ trong lớp dẫn xuất (trong gói khác) nếu được truy cập bằng đối tượng mới của lớp MyCollection. bạn chỉ có thể viết intg = 1; trực tiếp mà không làm (MyCollection mới) như thế này:

package secondary; 
import com.core.MyCollection;  
public class MyCollection2 extends MyCollection{ 

public void test(){ 

    intg = 1; 

} 
} 
3

Nếu một thành viên lớp là protected sau đó có 2 trường hợp:

  1. Nếu lớp con là trong cùng một gói
  2. Nếu lớp con là trong gói khác

I. Cùng gói:
- Có thể truy cập thông qua kế thừa
- Có thể truy cập bằng cách tạo một phiên bản của lớp cha
II. gói khác nhau:
- Can chỉ truy cập thông qua thừa kế

Xem bảng dưới đây cho tất cả các trường hợp sử dụng:

enter image description here

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