2012-01-03 3 views

答えて

1

詳細にアクセスできます。 Java言語仕様section 8.4.8.3から:

オーバーライドまたは隠蔽方法のアクセス修飾子(6.6)は、オーバーライド又は隠し方式と少なくとも同じくらいのアクセスを提供しなければならない、またはコンパイル時エラーが発生します。詳細:

  • オーバーライドまたは非表示のメソッドがpublicの場合、オーバーライドまたは非表示のメソッドはpublicでなければなりません。それ以外の場合は、コンパイル時エラーが発生します。
  • オーバーライドされたメソッドまたは隠されたメソッドが保護されている場合は、オーバーライドまたは隠蔽のメソッドを保護またはパブリックにする必要があります。それ以外の場合は、コンパイル時エラーが発生します。
  • オーバーライドまたは非表示のメソッドにデフォルト(パッケージ)アクセスがある場合は、オーバーライドまたは非表示のメソッドをプライベートにすることはできません。それ以外の場合は、コンパイル時エラーが発生します。
1

オーバーライドされるメソッドが緩い権限(例えば、公共の代わりに保護された)を有する場合、そのサブクラスの任意の参照は、オーバーライド許可の方法を有することになります。オーバーライドされたメソッドの権限がより厳格な場合、コンパイルエラーです。

JLS 8.4.8.3を参照してください(オーバーライドまたは隠蔽方法のアクセス修飾子(6.6)は、少なくともオーバーライドまたは隠しメソッドと同じアクセスを提供する必要があります)、またはコンパイル時エラーが発生します。

0

アクセス記述子を変更してメソッドのアクセスを増やしても問題はありませんが、サブクラス内のどのメソッドのアクセスも減らすことはできません。

class A{ 
    protected void foo(){ 
    } 
} 

class B1 extends A{ 
    public void foo(){ 
    } 
} 

class B2 extends A{ 
    private void foo(){ 
    } 
} 

class Example{ 
    public void ex(){ 
     A b1 = new B1(); 
     A b2 = new B2(); 

     b1.foo(); 
     b2.foo(); 
    } 
} 

b1.foo()は何の問題を作成しませんが、私たちは、コンパイル時にb2.foo()を許可するかどうかは、実行時に失敗します。そのため、メソッドのオーバーライド中にユーザーが任意のメソッドのアクセスを減らすことはできません

関連する問題