【问题标题】:How Runtime choose the invocation method between outer class method and super class?Runtime 如何在外部类方法和超类之间选择调用方法?
【发布时间】:2012-12-06 13:09:30
【问题描述】:

我注意到以下情况:内部类正在调用它的超类和外部类中的方法。代码如下:

 public class Main
    {

        class Inner extends InnerBase{
           public void callMethod(){
               method();
           }
        }

        void method(){
            System.out.println ("Called Main's method");
        }

        class InnerBase{
            void method(){
                System.out.println ("Called InnerBase's method");
            }
        }
    }

现在当 callMethod() 被调用时,它会调用超类的方法并打印“Called InnerBase's method”。如果我试图在调用方法()的方法()上从 IDE(Eclipse)“打开声明”,那么它将转到外部类中的方法。哪个是真实的令人困惑。您能否建议或提供一些材料来解释在外部类和超类中选择同名执行方法的情况。提前谢谢你。

【问题讨论】:

  • 让我看看我是否理解正确。你调用 Inner.callMethod(),对吗?所以它应该调用InnerBase.method()。但是您将进入 Inner.method() 的定义(来自 IDE),它会将您带到 Main.method()?
  • @dandrejvv 是的,IDE 没有提供任何警告
  • 对我来说这听起来像是 IDE 中的一个错误。

标签: java oop jvm


【解决方案1】:

通过使用qualified this(JLS §15.8.4. 限定此),您可以毫无疑问地指定所选方法将是什么。

public void callMethod()
{
    Main.this.method();
}

规则很简单:它总是选择最接近的方法。

InnerBase.method() 是它自己的方法的一部分。所以这比Main.method() 更接近,因为Main.method() 是另一个不相关类的一部分。如果你在Inner 中有另一个method(),那么它会选择那个方法,因为它在同一个类中。

【讨论】:

    【解决方案2】:

    您在这里有三个课程 - MainInnerInnerBaseInnerInnerBase,但Main 与它们完全无关。因此,当您在InnerBase 上调用callMethod() 时,它会调用它的OWN method() 实现,它继承来自InnerBase

    如果你想调用Mains method(),你必须明确地限定它。

    如果eclipse跳转到错误的方法,那么很可能是eclipse的错误。

    【讨论】:

      【解决方案3】:

      通过使用“限定 this”。

      Main.this.method()

      What does "qualified this" construct mean in java?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-09-24
        • 1970-01-01
        • 2011-12-08
        • 1970-01-01
        • 1970-01-01
        • 2019-04-16
        • 1970-01-01
        相关资源
        最近更新 更多