2017-11-21 4 views
0

私は、他の場合には、次にない次のコードでエラーが出ると理由を理解困難が午前保護し、デフォルトの修飾のJava

シナリオ1(エラーを持っている)

class App{ 
public static void main(String[]args) { 
    ClassA a = new ClassB(); 
    a.print(); 
    } 
} 

class ClassA {  
    protected void print() {} 
} 

class ClassB extends ClassA { 
    void print(){} 
    //creates error: Cannot reduce the visibility of the inherited method from ClassA 
} 

シナリオ2(いいえエラー)

class App{ 
public static void main(String[]args) { 
    ClassA a = new ClassB(); 
    a.print(); 
    } 
} 

class ClassA {  
    protected void print() {} 
} 

class ClassB extends ClassA {   
    protected void print(){} 
    //no error/ Override method 
} 

ご迷惑をおかけして申し訳ありません。

+0

パッケージプライベートあなたは減らす、コンパイラはであなたをほのめかしているものthat's、protected' 'より低い可視性を持っている例外を確認しました可視性は、 'protected'を無視することによって許されますが、これは許されません。 – SomeJavaGuy

答えて

1

デフォルトのアクセス修飾子(no keywordは)メソッドは、それが同じパッケージとsub-classes内のクラスにのみ表示さだprotectedアクセス修飾子を持つ場合を意味し、protectedアクセス修飾子よりも制限されます。 一方、(no keyword)アクセス修飾子は、同じパッケージ内のクラスに対してのみアクセスできます。 もう1つのことを知っておく必要があります。最も重要なルールの1つは、overriddenメソッドのアクセス修飾子が同じであるか、より制限の少ないアクセス修飾子でなければならないということです。メソッドをオーバーライドする

ルール:のみ継承されたメソッドがオーバーライドされ

  1. 子で
  2. 方法は
  3. 、最終的な民間および静的メソッドができない親にメソッドと同じシグネチャを持つ必要があります
  4. 戻り値の型またはサブタイプが同じである必要があります
  5. アクセス修飾子はl ESS-制限親
  6. 内の1つの新規またはより広範囲をスローしてはなりません以上が
+0

あまりにも多くのアフマド。私は規則5 Ahmadについて知らなかった。 –

0

あなたのエラーメッセージは、それがうまくいかない理由をほとんど説明しています。デフォルトのアクセス修飾子は、保護されたアクセス修飾子よりも制限的です。あなたは、印刷(すなわちClassBののサブクラスで)へのアクセスを持っているでしょうコンテキストから次のことをしようとするだろう場合、これはあなたに問題を与える:にClassAの

ClassA myClassA = new ClassB(); 
myClassA.print(); 

プリントがこのサブクラスにアクセス可能であるが、あなたならばでしょう機能しないより制限的なアクセス修飾子(つまり、デフォルトまたはプライベート)でオーバーライドを許可します。

関連する問題