【问题标题】:How can I call the overridden method in a child class from a parent class's inner class in JAVA?如何在 JAVA 中从父类的内部类调用子类中的重写方法?
【发布时间】:2017-05-24 06:52:29
【问题描述】:

所以我有一个父类 A 和一个 A 的内部类称为 I。我正在调用一个函数,即 pop(),它是 A 类的。现在这个 pop() 被 A 的子 B 覆盖了。

现在当从 I 调用 pop 时,是从 A 执行 pop 还是从 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(); 
  }
}

【问题讨论】:

  • 向我们展示代码(这取决于您调用 pop 方法的实例并假设 pop 不是静态的)。在论坛提问之前可能值得一试。
  • 封装测试人员; public class test { public void run(){ System.out.println("Inside test"); } public void irun(){ InnerClassOne o=new InnerClassOne(); o.inside(); System.out.println("irun 内部"); } private void inside() { // TODO 自动生成的方法存根 } class InnerClassOne { void inside() {System.out.println("Inside inner"); test.this.run(); } } }
  • 封装测试人员;公共类 test2 扩展测试 { public void run() { System.out.println("Overriden"); } public static void main(String []args){ test t1= new test(); t1.irun(); } }
  • 改为更新问题并在此处添加格式化代码

标签: java overloading


【解决方案1】:

当然,这完全取决于您如何创建新实例。假设我们有以下类:

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

因此取决于您是否创建了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(外部类),它仍然会打印Bye。那是因为当您将对象转换为另一种类型时,您只需使用另一种类型来引用它。对象的实际类型没有改变。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-18
    • 2019-01-05
    • 2017-07-22
    • 2011-04-17
    • 1970-01-01
    • 2020-01-14
    • 1970-01-01
    相关资源
    最近更新 更多