一个关于多态的题


public class Test {
public static void main( String[] args) {
m(new GraduateStudent());
m(new Student());
m(new Person());
}
public static void m(Object x){
System.out.println(x.toString());
}
}
class GraduateStudent extends Student {
}

class Student extends Person {
public String toString() {
return "Student" ;
}
}
class Person extends Object {
public String toString() {
return "Person";
}
/**
*本程序的运行之后的输出结果是:
*Student
*Student
*Person
*/

原因如下:
静态方法m调用的是参数对象x的toString()方法,由多态的调用规则,调用的方法由调用的对象决定(而不是引用的类型),因此
m(new GraduateStudent())试图调用class GraduateStudent extends Student中的toString()方法,但是该类中没有定义toString()方法,所以jvm只能向上寻找其基类class Student extends Person,然后找到了toString()方法,于是显示Student。
同理,m(new Student());也调用Student类的toString方法,显示Student.
而m(new Person());调用Person类的toString方法,显示Person.

并且我们必须有这样一个概念:
语句
Object mary = new Person();
的意思是用Object类型的引用(reference)引用一个Person类型的对象,其中mary的成员方法toString是由Person决定的,而不是Object。这个是多态的执行规则。跟静态不静态没有关系。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值