2012-02-17 18 views
15

Có một lý do nào có thể thay đổi công cụ sửa đổi truy cập của một phương pháp ghi đè không? Ví dụ,Thay đổi công cụ sửa đổi truy cập của một phương thức ghi đè trong Java?

abstract class Foo{ 
    void start(){...} 
} 

Và sau đó thay đổi sửa đổi lần truy cập gói tin tới public,

final class Bar extends Foo{ 
    @Override 
    public void start(){...} 
} 

Tôi chỉ hỏi câu hỏi này vì tò mò.

+1

thể trùng lặp của [bổ truy cập java và phương pháp trọng] (http://stackoverflow.com/questions/6851612/java-access-modifiers-and-overriding-phương pháp) –

Trả lời

17

Java không cho phép bạn thực hiện công cụ sửa đổi truy cập hạn chế hơn, vì điều đó sẽ vi phạm quy tắc mà thể hiện lớp con có thể sử dụng được thay cho trường hợp siêu lớp. Nhưng khi nói đến việc truy cập ít hơn hạn chế ... tốt, có lẽ siêu lớp được viết bởi một người khác và họ không lường trước được cách bạn muốn sử dụng lớp học của họ.

Các chương trình mọi người viết và các tình huống phát sinh khi lập trình rất đa dạng, tốt hơn cho các nhà thiết kế ngôn ngữ không "đoán trước" những gì người lập trình có thể muốn làm với ngôn ngữ của họ. Nếu không có lý do chính đáng tại sao một lập trình viên nên không phải có thể làm cho các trình chỉ định truy cập ít hạn chế hơn trong một lớp con (ví dụ), thì tốt hơn là để lại quyết định đó cho lập trình viên. Họ biết các chi tiết cụ thể về tình hình cá nhân của họ, nhưng nhà thiết kế ngôn ngữ thì không. Vì vậy, tôi nghĩ đây là một lời kêu gọi tốt bởi các nhà thiết kế Java.

6

Chỉ có một, bạn có thể muốn ghi đè để hiển thị bởi nhiều lớp hơn, vì không có công cụ sửa đổi nào là mặc định, công khai sẽ mở rộng điều đó.

+0

Vâng, đó là lợi ích duy nhất tôi có thể nhìn thấy ... Tôi không biết nếu có nhiều hơn để nó hơn thế. – mre

1

Chỉnh sửa: OK, tôi đã thay đổi câu trả lời của mình để khắc phục sự cố.

Nếu điều đó không thể thực hiện được, thì sẽ có một số trường hợp một lớp không thể thực hiện một mặt lặp và mở rộng lớp vì chúng có cùng phương thức với các công cụ sửa đổi truy cập khác nhau.

public Interface A { 
    public void method(); 
} 

public abstract classs B { 
    protected void method(); 
} 

public class AB extends B implements A { 
    /* 
    * This would't be possible if the access modifier coulnd't be changed 
    * to less restrictive 
    */ 
    public void method(); 
} 
+1

Tất cả các phương thức được xác định trong giao diện đều được ngầm công khai. – GriffeyDog

+1

Tất cả các phương thức giao diện phải được công khai. – Puce

+0

Bạn không thể khai báo phương thức không phải là pub trong một giao diện công cộng hoặc được bảo vệ (thần chỉ biết giao diện được bảo vệ là gì). http://java.sun.com/docs/books/jls/second_edition/html/interfaces.doc.html Xem phần 9.1.4 – Dunes

6

Mở rộng lớp có nghĩa là phân lớp ít nhất phải cung cấp cùng chức năng cho các lớp khác.

Nếu anh ấy mở rộng điều đó, thì đó không phải là vấn đề.

Mở rộng có thể là thêm phương pháp mới hoặc bằng cách cung cấp các phương thức hiện có cho nhiều lớp hơn như đặt phương thức truy cập gói công khai.

2

Các Giải thích là thế này: -

Đó là một nguyên tắc cơ bản trong OOP: lớp trẻ là một trường hợp hoàn toàn chính thức của> lớp cha mẹ, và phải do đó hiện tại ít nhất là giao diện tương tự như phụ huynh lớp học. > Làm cho những điều được bảo vệ/công khai ít hiển thị hơn sẽ vi phạm ý tưởng này; bạn có thể làm cho con> các lớp không sử dụng được như các cá thể của lớp cha.

class Person{ 
public void display(){ 
    //some operation 
} 
} 

class Employee extends Person{ 
private void display(){ 
    //some operation 
} 


Person p=new Employee(); 

Ở đây p là tham chiếu đối tượng với kiểu Person (siêu lớp), khi chúng tôi đang kêu gọi> p.display() như sửa đổi lần truy cập là hạn chế hơn đối tượng tham khảo p không thể truy cập đối tượng con của loại nhân viên