2012-01-27 29 views
6

tôi nhận này lỗi biên dịch:Không thể làm giảm tầm nhìn của phương pháp phương pháp được thừa hưởng từ cha mẹ

You cannot reduce the visibility of a inherited method.

Tôi có đoạn code sau

class Parent {  
    public void func() { 
     System.out.println("in Parent"); 
    } 
} 

public class TestClass extends Parent {  
    public static void main(String args[]) { 
     parent obj=new TestClass(); 
     obj.addTest(); 
    } 

    private void func() { 
     System.out.println("in child");   
    } 
} 

Đây tầng lớp phụ huynh có func() phương pháp đó là công khai và ghi đè bởi các subclass TestClass là riêng tư. Bây giờ trình biên dịch ném lỗi mà tôi không thể làm giảm khả năng hiển thị. Để nói về mặt kỹ thuật, bất cứ khi nào tôi tạo đối tượng của TestClass gán cho đối tượng kiểu cha, vì phương thức func() bị ghi đè, hàm func() của TestClass sẽ được gọi là luôn, vậy tại sao chúng ta nên quan tâm đến khả năng hiển thị? lý do đằng sau lỗi này là gì? Ai đó có thể giải thích rõ ràng cho tôi không?

Trả lời

20

Đó là vì lớp con có khả năng hiển thị là private cho phương thức void func(), nhưng lớp cha có khả năng hiển thị public.

Nếu mã của bạn được phép để biên dịch, nó sẽ bùng nổ trong thời gian chạy nếu bạn đã làm điều này:

parent p = new TestClass(); 
p.func(); // boom - func is public in parent, but TestClass's impl is private, so no access would be allowed 

Để "sửa chữa" này, hãy chắc của lớp con func phương pháp public:

public class TestClass extends parent { 
    ... 
    public void func() { // give it public visibility 
     System.out.println("in child");   
    } 
} 


Và vui lòng sử dụng quy ước đặt tên chuẩn; trong trường hợp này "lớp học nên bắt đầu với một chữ cái viết hoa" - tức là Parent không parent

+0

Cảm ơn Bohemain. Tôi có lý do. Cảm ơn bạn đã chỉ ra các tiêu chuẩn đặt tên. – Mojoy

+0

Hi .. Điều này làm cho tôi suy nghĩ tại sao tôi không thể sửa đổi bảo vệ trong lớp con cho một phương pháp được công khai trong lớp siêu? Kể từ khi sửa đổi bảo vệ có thể được truy cập trong gói và các loại phụ của gói bất kỳ !! – Mojoy

+0

Các phương thức 'protected' không hiển thị đối với các lớp tùy ý khác, nhưng phương thức' public' của siêu là, vì vậy cùng một lý do được áp dụng. * Bất kỳ * giảm khả năng hiển thị là một lỗi. – Bohemian

11

Từ section 8.4.8.3 of the Java Language specification:

The access modifier (§6.6) of an overriding or hiding method must provide at least as much access as the overridden or hidden method, or a compile-time error occurs. In more detail:

  • If the overridden or hidden method is public, then the overriding or hiding method must be public; otherwise, a compile-time error occurs.
  • If the overridden or hidden method is protected, then the overriding or hiding method must be protected or public; otherwise, a compile-time error occurs.
  • If the overridden or hidden method has default (package) access, then the overriding or hiding method must not be private; otherwise, a compile-time error occurs.

Note that a private method cannot be hidden or overridden in the technical sense of those terms. This means that a subclass can declare a method with the same signature as a private method in one of its superclasses, and there is no requirement that the return type or throws clause of such a method bear any relationship to those of the private method in the superclass.

Sau khi tất cả, bạn muốn chỉ mong đợi một phương pháp private được gọi bởi mã trong cùng một lớp - nếu nó kết thúc được gọi là do ghi đè một phương pháp công khai, điều đó sẽ khá khó hiểu.

2

Nếu bạn nghĩ về nó, không có khả năng để làm điều này làm cho tinh thần ..

Lý do là bạn có thể vượt qua các đối tượng trẻ em xung quanh như thể đó là phụ huynh một (tức là bạn có thể sử dụng các loại mẹ như loại tham chiếu đến một cá thể TestClass).

ví dụ:

parent p = new TestClass(); 

Có lẽ một số mã khác trong đó sử dụng parent loại và gọi phương pháp đó:

ví dụ

public static void aMethod(parent aParent){ 
    p.func(); 
} 

Nếu bạn đã có thể làm giảm tầm nhìn của các phương pháp sau đó gọi aMethod(p) sẽ phải ném một số loại ngoại lệ thời gian chạy - không cho phép điều này đảm bảo điều này là không cần thiết.

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