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。这个是多态的执行规则。跟静态不静态没有关系。