2017-05-24 52 views
0

所以我有一個父類說A和一個名爲I的內部類。我正在調用一個函數,即pop(),它是A類的。現在這個pop()被B覆蓋了,這是A的一個子代。如何在JAVA中從父類的內部類調用子類中的重寫方法?

現在當pop被我從中調用時,會從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 公共無效的run(){ \t \t的System.out.println( 「內部測試」); \t} \t \t 公共無效伊倫(){ \t \t InnerClassOne O =新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 inner」); \t \t \t \t test.this.run(); \t \t} \t} } –

+0

包測試人員; \t公共類TEST2延伸測試 {公共無效的run(){ \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' 
    } 
} 

所以dependenant上,如果你創建的TestTest2一個實例,它只是調用外部類的print功能。

當你施放到TestInnerTest類,你可能會看到一些意外行爲:

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(外部類),它仍然打印再見。這是因爲當你將對象轉換爲另一種類型時,你只需使用另一種類型來引用它。對象的實際類型不會更改。

相關問題