scjp中的一道重载问题

首先大家看一下这道题的代码

class Scott {
void prints(Scott s) {
System.out.println("Scott");
}

}

public class Group extends Scott {
void prints(Group g) {
System.out.println("Group");
}

public static void main(String[] args) {
Scott s = new Group();
s.prints(new Group());
}
}

提问:what is output?
分析这道题目,很容易让人误以为是多态行为,输出Group
但是仔细分析,Group是Scott的导出类,Group重载(Overload)了prints方法,而不是重写(Override),因为重写要求方法名称,与参数类型、个数、顺序都必须相同的情况下才能发生。现在Scott只有一个接口prints(Scott s),而Group有两个接口prints(Scott s),prints(Group g)。
好了,现在看main函数里面的代码,新建了一个Group对象,Scott引用(reference)s指向了Group对象,发生了向上转型(upcast)。引用s调用prints方法,这时候大家请注意了,由于Scott类型只有一个接口prints(Scott s),所以只能调用这个方法,new Group()生成了一个Group对象,由于Group类是Scott类的导出类,所以可以自动向上转型为Scott类型,最后输出了Scott
输出结果为:
Scott

------------2008-10-16 20:35补充---------------
刚刚突然想到了,为了进一步理解向上转型,这道题还可以增加一句有意思的代码

class Scott {
void prints(Scott s) {
System.out.println("Scott");
}

}

public class Group extends Scott {
void prints(Group g) {
System.out.println("Group");
}

public static void main(String[] args) {
Scott s = new Group();
s.prints(new Group());
((Group) s).prints(new Group()); //新增
}
}

大家注意到新增加了一句
((Group) s).prints(new Group());
这里使用到了向下转型(downcast),由于Scott类只有一个接口prints(Scott s),而Group有两个接口prints(Scott s)和prints(Group g),这里实际上想调用的接口为Group类的扩展接口prints(Group g),所以通过向下转型就可以调用到Group类的扩展接口prints(Group g),因此新增加的这句代码输出:Group
程序的全部输出结果为:
Scott
Group

声明:JavaEye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值