2017-05-24 7 views
0

그래서 하나의 부모 클래스를 A라고하고 A라는 내부 클래스를 I라고합니다. 즉 클래스 A 인 pop()이라는 한 함수를 호출하고 있습니다. 이제이 pop()은 A의 자식 인 B에 의해 무시됩니다.JAVA의 부모 클래스의 내부 클래스에서 자식 클래스의 재정의 된 메서드를 호출하려면 어떻게해야합니까?

이제 pop이 I에서 호출 될 때 A가 실행되거나 B가 실행됩니다.

package testers; 
public class test 
{ 
    public void run() 
    { 
    System.out.println("Inside test"); 
    } 
    public void irun() 
    { 
    InnerClassOne o=new InnerClassOne(); 
    o.inside(); 
    System.out.println("Inside irun"); 
    } 
    private void inside() 
    { 
    // TODO Auto-generated method stub 
    } 
    class InnerClassOne 
    { 
    void inside() 
    { 
     System.out.println("Inside inner"); 
     test.this.run(); 
    } 
    } 
} 


package testers; 
public class test2 extends test 
{ 
    public void run() 
    { 
    System.out.println("Overriden"); 
    } 
    public static void main(String []args) 
    { 
    test t1= new test(); 
    t1.irun(); 
    } 
} 
+0

코드를 표시하십시오 (pop 메소드를 호출하는 인스턴스에 따라 다르며 pop이 정적이 아닌 것으로 가정). 포럼에서 요청하기 전에 시도해 볼 가치가 있습니다. – SMA

+0

패키지 테스터; 공용 클래스 테스트 { \t \t 공공 무효 실행() { \t \t에서 System.out.println ("테스트 인사이드"); \t} \t \t 공개 무효 이룬() { \t \t InnerClassOne 오 = 새로운 InnerClassOne(); \t \t o.inside(); \t \t System.out.println ("내부 irun"); \t} \t 개인 공극 내부() { \t \t는 // TODO 자동 생성 방법은() \t \t {System.out에 \t { \t \t 공극 내부 \t \t \t} \t 클래스 InnerClassOne 스터브. println ("내부 내부"); \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

완전히 새로운 인스턴스를 만드는 방법에 따라 달라집니다. 이제 우리는 다음과 같은 클래스가 있다고 가정 해 봅시다 : 당신은 단지 외부 클래스의 print 함수를 호출 Test 또는 Test2의 인스턴스를 만든 경우

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' 
    } 
} 

등등 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 (외부 클래스) 캐스팅에도 불구을 여전히 안녕을 인쇄합니다. 그 이유는 객체를 다른 유형으로 캐스팅 할 때 다른 유형을 사용하여 객체를 참조하기 때문입니다. 오브젝트의 실제 유형은 변경되지 않습니다.