2017-05-24 1 views
0

私は1つの親クラスにAとAという内部クラスを持っています。私はクラスAの1つの関数pop()を呼び出しています。今度はこのpop()は、Aの子であるBによってオーバーライドされます。子クラスのオーバーライドされたメソッドをJAVAの親クラスの内部クラスから呼び出す方法はありますか?

今からポップがIから呼び出されているとき、Aからポップされますか?

+0

私たちにコードを教えてください(popメソッドを呼び出すインスタンスに依存し、popは静的ではないと仮定します)。フォーラムで質問する前に試してみる価値があります。 – SMA

+0

パッケージテスター; パブリッククラスのテスト{ \t \tます。public void実行(){ \t \tのSystem.out.println( "内部テスト"); \t} \t \t公共ボイドイルン(){ \t \t InnerClassOne 0 =新たInnerClassOne()。 \t \t o.inside(); \t \t System.out.println( "inside irun"); \t} \t内部プライベートボイド内部(){ \t \t // TODO自動生成方法スタブ \t \t \t} \tクラスInnerClassOne \t {\t \tボイド() \t \t {のSystem.out。 println( "inside inside"); \t \t \t \t test.this.run(); \t \t} \t} } –

+0

パッケージテスター; \tパブリッククラスTEST2がテスト {公共ボイドラン(){ \tのSystem.outを拡張します。println( "オーバーライド"); } \tパブリック静的無効メイン(文字列[] args){ \t試験T1 =新しいテスト(); t1.irun(); \t \t \t} } –

答えて

0

これは、もちろん、新しいインスタンスの作成方法によって異なります。我々は、次のクラスがあるとしましょう:

public class Test { 

    public void print() { 
     System.out.println("Hi"); 
    } 

    public class TestInner { 
     public void doSomething() { 
      print(); 
     } 
    } 
} 


public class Test2 extends Test { 

    @Override 
    public void print() { 
     System.out.println("Bye"); 
    } 
} 

...

public class Main { 

    public static void main(String[] args) { 
     Test t1 = new Test(); 
     Test.TestInner testInner1 = t1.new TestInner(); 

     Test2 t2 = new Test2(); 
     Test2.TestInner testInner2 = t2.new TestInner(); 

     System.out.println("Test inner 1 doSomething: "); 
     testInner1.doSomething(); 
     //Prints 'Hi' 

     System.out.println("Test inner 2 doSomething: "); 
     testInner2.doSomething(); 
     //Prints 'Bye' 
    } 
} 

あなたはそれだけで外部クラスのprint関数を呼び出しTestまたはTest2のインスタンスを作成したのであれば上dependenant。

あなたがTestInnerまたはTestクラスにキャストするとあなたには、いくつかの予期しない動作が表示されることがあります

public class Main { 

    public static void main(String[] args) { 
     Test t1 = new Test(); 
     Test.TestInner testInner1 = t1.new TestInner(); 

     Test2 t2 = new Test2(); 
     Test2.TestInner testInner2 = t2.new TestInner(); 

     Test.TestInner testInner3 = (Test.TestInner) testInner2; 
     System.out.println("Test inner 3 (cast inner) doSomething: "); 
     testInner3.doSomething(); 
     //Prints 'Bye' 

     Test t3 = (Test) t2; 
     Test.TestInner testInner4 = t3.new TestInner(); 
     System.out.println("Test inner 4 (cast wrapper class) doSomething: "); 
     testInner4.doSomething(); 
     //Prints 'Bye' 
    } 
} 

我々は明示的にtestInner3(内部クラス)とtestInner4(外部クラス)をキャストにもかかわらず、それはまださようならを印刷します。これは、オブジェクトを別の型にキャストするときに、別の型を使用して参照するだけだからです。オブジェクトの実際のタイプは変更されません。

関連する問題