运行时如何选择外类方法和超类之间的调用方法?

时间:2012-12-06 13:09:31

标签: java oop jvm

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

 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的方法”。如果我试图在IDE(Eclipse)上调用callMethod()中调用的方法()上的“Open Declaration”,那么它将转到外部类中的方法。令人困惑的是,一个人称之为真实。能否建议或提供一些解释在外类和超类中选择同名执行方法的情况的材料。提前谢谢。

3 个答案:

答案 0 :(得分:5)

通过使用qualified this(JLS§15.8.4。合格的这个),您可以毫无疑问地指定所选方法将是什么。

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

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

InnerBase.method()是其自身方法的一部分。因此,它比Main.method()更接近,因为Main.method()是另一个不相关的类的一部分。如果method()中有另一个Inner,那么它会选择该方法,因为它位于同一个类中。

答案 1 :(得分:2)

这里有三个课程 - MainInnerInnerBaseInnerInnerBase孩子,但Main与他们完全无关。因此,当您在callMethod()上致电InnerBase时,它将从method()中将其继承的实施称为OWN InnerBase

如果您想致电Main s method(),则必须明确限定它。

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

答案 2 :(得分:2)

使用“合格的”。

Main.this.method()

What does "qualified this" construct mean in java?