私は1つの親クラスにAとAという内部クラスを持っています。私はクラスAの1つの関数pop()を呼び出しています。今度はこのpop()は、Aの子であるBによってオーバーライドされます。子クラスのオーバーライドされたメソッドをJAVAの親クラスの内部クラスから呼び出す方法はありますか?
今からポップがIから呼び出されているとき、Aからポップされますか?
私は1つの親クラスにAとAという内部クラスを持っています。私はクラスAの1つの関数pop()を呼び出しています。今度はこのpop()は、Aの子であるBによってオーバーライドされます。子クラスのオーバーライドされたメソッドをJAVAの親クラスの内部クラスから呼び出す方法はありますか?
今からポップがIから呼び出されているとき、Aからポップされますか?
これは、もちろん、新しいインスタンスの作成方法によって異なります。我々は、次のクラスがあるとしましょう:
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
(外部クラス)をキャストにもかかわらず、それはまださようならを印刷します。これは、オブジェクトを別の型にキャストするときに、別の型を使用して参照するだけだからです。オブジェクトの実際のタイプは変更されません。
私たちにコードを教えてください(popメソッドを呼び出すインスタンスに依存し、popは静的ではないと仮定します)。フォーラムで質問する前に試してみる価値があります。 – SMA
パッケージテスター; パブリッククラスのテスト{ \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} } –
パッケージテスター; \tパブリッククラスTEST2がテスト {公共ボイドラン(){ \tのSystem.outを拡張します。println( "オーバーライド"); } \tパブリック静的無効メイン(文字列[] args){ \t試験T1 =新しいテスト(); t1.irun(); \t \t \t} } –