2016-10-19 7 views
1
class A { //1st code starts here 
    private void display() { 
     System.out.println("A class"); 
    } 
} 

class B extends A { 

    protected void display() { 
     System.out.println("B class"); 
    } 
} 

class Test { 

    public static void main(String args[]) { 
     A obj = new B(); 
     obj.display(); 
    } 
} 

出力:Test.java:22:エラー:表示は() obj.displayでプライベートアクセスを()があります。JAVAのオーバーライドと内部クラス概念

class Outer{  //2nd Code starts here 

    class Inner1{ 
     private void m2() { 
      System.out.println("Inner1 class"); 
     } 
    } 

    class Inner2 extends Inner1{ 
     protected void m2() { 
      System.out.println("Inner2 class"); 
     } 
    } 

    public static void main(String args[]) { 
     Outer o=new Outer(); 
     Outer.Inner1 i=o.new Inner2(); 
     i.m2(); 
    } 
} 

出力:Inner1クラス

はなぜ第二のコードで出力Inner1クラスながら、第一のコードに時間コンパイルエラー?

+4

プライベートメソッドをオーバーライドすることはできません。 –

+3

内部クラスの可視性は、スーパークラスの可視性より大きくすることはできません。 –

+0

囲むクラスはその内部クラスの 'private'メンバーにアクセスできるので、 2番目の例の 'Outer'クラスは' Inner1'クラスの 'private'メソッド' m2'にアクセスすることができます。 – Jesper

答えて

3

Outerクラスのコードは、アクセスレベルに関係なく、Outerクラス内で宣言されたメンバーまたはメソッドにアクセスできます。ただし、メソッドをオーバーライドすることはできないため、m2メソッドが呼び出されているのは、基本クラスInner1のメソッドです。

一方、Testクラスのコードは、別のクラスのprivateメソッドにアクセスすることができないため、そのコードはコンパイルをパスしません。

+0

親クラスのプライベートメソッドをオーバーライドすることはできません。最初に投稿されたコードが間違っていてエラー表示が正しくない – Blip

+4

@Blipいいえ、申し訳ありませんが間違っています。あなたは、スーパークラスではプライベートメソッド 'm'を、サブクラスでは' m'メソッドを持つことができます。サブクラスメソッドは、スーパークラスメソッドをオーバーライドしません。彼らは同じ名前を持つように起こるちょうど2つの別々の方法です。やってみて。 – Jesper

+0

@Jesper私はあなたが正しいことを知っている。これはオーバーライドではなく、新しいメソッドとして宣言されています。私を修正してくれてありがとう。 – Blip

1

プライベートメンバーにはクラスでしかアクセスできないため、 クラスBの拡張プライベートメンバーにアクセスできない場合Bの場合 内部クラスの場合、内部クラスはクラスのメンバーであり、囲むクラスのすべてのメンバーにアクセスできます。