返回信息流class B {
public void go(double d) {
System.out.println("B.go(double)");
}
}
public class A extends B {
public void go(int i) {
System.out.println("A.go(int)");
}
public void go(double d) {
System.out.println("A.go(double)");
}
public static void main(String[] args) {
A a = new A();
B b = a;
b.go(1);
}
}
这是一条镜像帖。来源:北邮人论坛 / java / #12120同步于 2009/11/9
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖
程序输出结果如何解释?
walsh
2009/11/9镜像同步21 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
对象b不能访问类A中的public void go(int i)方法,因为这是类A新增加的成员方法,所以
b.go(1)只能匹配A中的public void go(double d)
顶ls,动态绑定时只能绑定被重写的方法
class 人{
吃饭();
}
//算日本人是人
class 日本人 extends 人{
吃饭();
拍片();
}
另外有个函数:
void doSomething(参数:一个人){
一个人.拍片();//这里就会编译出错,因为编译器只知道参数类型是人,而人的通用行为里只有吃饭,没有拍片
一个人.吃饭();//这里没有编译错,因为编译器知道人有吃饭的行为。具体的行为是日本人吃饭还是中国人吃饭,就看传的是什么人了,靠运行时函数的晚绑定实现。
}
【 在 buptljl 的大作中提到: 】
: 对象b不能访问类A中的public void go(int i)方法,因为这是类A新增加的成员方法,所以
: b.go(1)只能匹配A中的public void go(double d)
学习了
多态,这个貌似考的是多态的基础
在父类引用指向子类对象后,如B b = new A();,实际上b已经不能调用子类A自己独有的方法了,而只能调用父类中有的方法;如果父类中的方法,子类实现了,则会调用子类自己的方法,如果子类没有重写父类的方法,则会调用父类的方法!
貌似应该是这样的
【 在 buptljl 的大作中提到: 】
: 对象b不能访问类A中的public void go(int i)方法,因为这是类A新增加的成员方法,所以
: b.go(1)只能匹配A中的public void go(double d)
我也是这么想的,可输出结果是:A.go(double)
而不是B.go(double)
但不知为何不调用类B中的方法,而是调用了类A中的方法