Java的方法嵌套调用,且接口和继承同时出现时,内层方法动态绑定的奇怪现象?

public class Question {

public static void main(String[] args) {

MyInterface child = new Child();

//接口多态参数 和 继承 同时出现时的 两种动态绑定现象

//1、正常的动态绑定现象

// child.toSay();//编译报错:Cannot resolve method 'toSay' in 'MyInterface',可以理解

System.out.println(((Dad) child).toSay());//输出"toSay Child...",可以理解

child.toString();//不报错,无法理解???

//2、二次动态绑定现象

System.out.println(child.toString());//输出"toSay Child...",无法理解???

}

}

interface MyInterface {

}

class Grandpa {

public String toSay() {

return "toSay Grandpa...";

}

}

class Dad extends Grandpa implements MyInterface {

public String toString() {

return toSay();

}

public String toSay() {

return "toSay Dad...";

}

}

class Child extends Dad {

public String toSay() {

return "toSay Child...";

}

}

  • 先说下我的水平和对动态绑定的理解:
    水平:Java初学者
    动态绑定:某对象向上转型后,只能调用

    1. 父类中没被重写的方法
    2. 子类中重写了的父类中已有的方法
    3. 接口实现类中实现了的上级接口中已有的方法
  • 对代码和问题的解释:
    主方法里最后一句话调用toString,这是第一次动态绑定;
    toString里面又调用了toSay,这是第二次动态绑定(或者说是方法嵌套调用时,内层方法的动态绑定)。

这两次动态绑定,绑定的东西好像不一样。

第一次(调用toString)是绑定child,但为什么child可以调用MyInterface接口中没有的toString方法?(问题一
toString方法并没有在接口中定义,属于实现类的私有方法,按说是不能被向上转型后的child调用的。

第二次(在toString内部调用toSay)不知道绑定了啥,但肯定不是child了吧。
因为toSay是实现类的私有方法,且child.toSay();会编译报错。
那第二次绑定的是啥呢?或者说第二次的动态绑定规则是啥呢?(问题二


回答:

  1. toString() 是 Object 的方法,是个对象就有
  2. 实际运行的方法与实际的类型有关,与声明的类型无关


回答:

jls-9.2

9.2. Interface Members
The members of an interface are:
......

If an interface has no direct superinterface types, then the interface implicitly declares a public abstract member method m with signature s, return type r, and throws clause t corresponding to each public instance method m with signature s, return type r, and throws clause t declared in Object (§4.3.2), unless an abstract method with the same signature, same return type, and a compatible throws clause is explicitly declared by the interface.

所有 Object 的 public 方法都在 interface 中隐含地定义了一次。

以上是 Java的方法嵌套调用,且接口和继承同时出现时,内层方法动态绑定的奇怪现象? 的全部内容, 来源链接: utcz.com/p/944393.html

回到顶部