2012-02-17 11 views
15

オーバーライドされたメソッドのアクセス修飾子を変更できる理由はありますか?たとえば、その後、Javaでオーバーライドされたメソッドのアクセス修飾子を変更しますか?

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

そしてpublicにパッケージプライベートアクセス修飾子を変更、

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

私は好奇心から、この質問をしています。

+1

可能重複http://stackoverflow.com/questions/6851612/java-access-modifiers-and-overriding-methods) –

答えて

17

Javaでは、アクセス修飾子は、サブクラスインスタンスがスーパークラスインスタンスの代わりに使用できるルールに違反するため、をより制限することはできません。しかし、アクセスをより小さくすることになると、は制限されます...おそらく、スーパークラスは別の人が書いたもので、クラスの使い方を予期しませんでした。

プログラミング時に発生するプログラムや状況は非常に多様です。言語設計者は、プログラマが自分の言葉で何をしたいのかを第二に推測しない方が良いでしょう。プログラマがでなく、のようにサブクラスでアクセス指定子をあまり制限しないようにする理由がない場合は、その決定をプログラマに任せておく方がよいでしょう。彼らは個々の状況の詳細を知っていますが、言語設計者はそうではありません。だから私はこれがJavaのデザイナーからの良い呼びだと思います。

6

デフォルトでは変更がないので、オーバーライドをより多くのクラスで表示することができます。

+0

ええ、それは私が見ることができる唯一の利点でした...それ以上にそれがあるかどうかはわかりませんでした。 – mre

1

編集:問題を解決するために私の答えを変更しました。

これを行うことができない場合、異なるアクセス修飾子で同じメソッドを持つため、クラスがiterfaceを実装してクラスを拡張できない場合があります。

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

インターフェイスに定義されているすべてのメソッドは、暗黙的にパブリックです。 – GriffeyDog

+1

インターフェイスのすべてのメソッドは公開されている必要があります。 – Puce

+0

公開または保護されたインターフェイスでは、非公式のメソッド宣言を使用することはできません(神は、保護されたインターフェイスの意味のみを知っています)。 http://java.sun.com/docs/books/jls/second_edition/html/interfaces.doc.htmlセクション9.1.4を参照してください。 – Dunes

6

クラスの拡張は、サブクラスが少なくとも他のクラスに同じ機能を提供する必要があることを意味します。

彼がそれを拡張すれば、それは問題ではありません。

新しいメソッドを追加するか、パッケージアクセスメソッドをpublicにするなど、既存のメソッドをさらに多くのクラスに提供することができます。

2

は、について説明がこれです: -

それはOOPの基本的な原則です:子クラス>は親クラスの本格的なインスタンスであり、親としてしなければならないため、現在、少なくとも同じインターフェイスクラス。 >保護された/公開されているものを見えにくくすることは、この考え方に違反します。子クラスを親クラスのインスタンスとして使用できなくすることができます。

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

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


Person p=new Employee(); 

はここでpはPerson型(スーパークラス)、私たちが呼んでいる> pのオブジェクト参照です。ディスプレイ()アクセス修飾子は、より限定的であるようにオブジェクト 参照pがEmployee型の子オブジェクトにアクセスすることができない

[Javaアクセス修飾子とオーバーライドメソッド(の
関連する問題