代码之家  ›  专栏  ›  技术社区  ›  mbairy

为什么JVM在继承树中从子级到父级搜索方法?

  •  4
  • mbairy  · 技术社区  · 6 年前

    下面是我正在查看的示例代码,我想知道为什么当父类中存在类似的方法,并且引用的类型是parent,而对象的类型是child时,JVM总是在子类中查找方法。

    class A{
        public void saveLink(){
            System.out.println("A: saveLink");
            bookmark();
        }
        public void bookmark() {
            System.out.println("A: bookmark");
        }
    }
    
    class B extends A{
        public void bookmark(){
            System.out.println("B: bookmark");
        }
    }
    
    class C extends B{
    
    }   
    
    class Test {
        public static void main(String[] args) {
            A a = new A();
            A b = new B();
            A c = new C();
    
            c.saveLink();
        }
    }
    

    当我运行上述代码时,它会输出:

    A: saveLink
    B: bookmark
    

    有人能解释一下吗?

    1 回复  |  直到 6 年前
        1
  •  2
  •   ernest_k Petronella    6 年前

    这是在Java中实现多态性的方法之一。它被称为动态绑定。

    运行时执行的实现是通过查看调用方法的对象的实际类来确定的。

    在你的情况下,当你申报 A b = new B(); b.bookmark() ,Java首先查看运行时,对象的实际类型( B new B() ),而不考虑其静态或声明类型(即,不考虑指向对象的变量的声明类型)。

    当Java看到方法在运行时类中被重写时(对于object就是这种情况) b 在您的示例中),它执行该实现。否则,它会遍历类层次结构以找到继承的实现,正如您所注意到的(对象就是这种情况) c 在你的例子中)。


    • 这种行为只是为了 实例方法 (它不适用于静态方法或字段)。静态方法是根据声明的/静态类型选择的。
    • 有一个例外(我能想到):当通话结束时 super.bookmark() ,那么Java就必须运行超类的实现—这在您的示例中不是一个场景。