返回信息流class A{
protected void hello(Object o){
System.out.println("hello-A");
}
}
public class B extends A{
protected void hello(String s){
System.out.println("hello-B1");
}
protected void hello(Object o){
System.out.println("hello-B2");
}
public static void main(String[] args){
A a=new B();
String arg1="ABC";
a.hello(arg1);
}
}
以上这段代码输出为什么是hello-B2呢?
这是一条镜像帖。来源:北邮人论坛 / java / #25450同步于 2013/5/22
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖
一个小题目
girlgogoal
2013/5/22镜像同步10 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
不懂,观望下
【 在 girlgogoal (悠悠) 的大作中提到: 】
: class A{
: protected void hello(Object o){
: System.out.println("hello-A");
: ...................
貌似知道为什么了。。
类B中的第一个hello方法,a是不能调用的,因为这个hello是B类特有的方法,除非对a进行强制类型转换,所以按照多态,应该去调用B中第2个hello,所以输出hello-B2
严格地写的话,应该加上@Override标注,表示那个方法是重写的。
protected void hello(String s){
System.out.println("hello-B1");
}
+ @Override
protected void hello(Object o){
System.out.println("hello-B2");
}
嗯 是 这样就清楚了
【 在 nuanyangyang 的大作中提到: 】
: 严格地写的话,应该加上@Override标注,表示那个方法是重写的。
: [code=java]
: protected void hello(String s){
: ...................
或者看看,下面一个程序应该输出什么:
class A{
protected void hello(Object o){
System.out.println("hello-A");
}
}
public class Main {
public static void main(String[] args){
A a=new B(); // 已知B是别人定义的类,继承A
String arg1="ABC";
a.hello(arg1);
}
}
a.hello(arg1);中,a是一个引用变量,是A类型的,this指向b,
arg1是String类型的,因此在A里边找Hello(Sting ),结果没有,再去A的超类里边找
但A没有超类,因此转到第三优先级this.Hello((super)String) (super)String是Object
但a引用的是B的一个对象,而B已经重写了Hello(Object) 所以最后输出hello-B2