首页 > 解决方案 > Java中的动态绑定与子类

问题描述

interface  I {
    public  void m1();
    public  void m3();
 }
 class A implements I {
    public void m1() {
       System.out.println("A.m1");
       this.m2(this);
    }
    public void m2(I obj) {
       System.out.println("A.m2");
       obj.m3();
    }
    public void m3() {
       System.out.println("A.m3");
    }
 }
 public class B extends A {
    public void m2(I obj) {
       System.out.println("B.m2");
       super.m2(obj);
    }
    public void m3() {
       System.out.println("B.m3");
    }
 
    public static void main(String[] args){
      I obj = new B();
      obj.m1();
    }
 }

调用方法时,java 编译器首先检查 obj 的表观类型是否具有该方法(在这种情况下,它检查接口 I 是否具有方法 m1() ),然后检查实际方法调用的实际类型(因此它调用 A 的 m1() 方法,因为 B 类没有它)。但是,为什么 java 编译器在 A 的 m1() 方法中调用 this.m2() 时不检查我的接口是否有 m2() 方法?该程序的输出如下:

A.m1
B.m2
A.m2
B.m3

标签: java

解决方案


推荐阅读