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初学者
动态绑定:某对象向上转型后,只能调用- 父类中没被重写的方法
- 子类中重写了的父类中已有的方法
- 接口实现类中实现了的上级接口中已有的方法
- 对代码和问题的解释:
主方法里最后一句话调用toString,这是第一次动态绑定;
toString里面又调用了toSay,这是第二次动态绑定(或者说是方法嵌套调用时,内层方法的动态绑定)。
这两次动态绑定,绑定的东西好像不一样。
第一次(调用toString)是绑定child,但为什么child可以调用MyInterface接口中没有的toString方法?(问题一)
toString方法并没有在接口中定义,属于实现类的私有方法,按说是不能被向上转型后的child调用的。
第二次(在toString内部调用toSay)不知道绑定了啥,但肯定不是child了吧。
因为toSay是实现类的私有方法,且child.toSay();会编译报错。
那第二次绑定的是啥呢?或者说第二次的动态绑定规则是啥呢?(问题二)
回答:
- toString() 是 Object 的方法,是个对象就有
- 实际运行的方法与实际的类型有关,与声明的类型无关
回答:
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