阅读如下代码,结果是什么?
public class Person {
String name = "person";
public void shout(){
System.out.println(name);
}
}
public class Student extends Person{
String name = "student";
}
public class Test {
public static void main(String[] args) {
Person person = new Student();
person.shout();
System.out.println(person.name);
}
}
运行结果为:
解释:当子类没有重写父类的方法时,父类引用指向子类对象的时候,父类引用所能看到的只是属于父类的那部分属性和方法。
在父类方法shout()中,打印的是父类的属性name,所以输出结果为父类的属性值person。
对比如下代码:若子类重写了父类的shout()方法:
public class Student extends Person{
String name = "student";
/**
*重写父类的方法
*/
public void shout(){
System.out.println(name);
}
public static void main(String[] args) {
Person person = new Student();
person.shout();
}
}
此时输出的结果为:
为什么重写父类的方法后,输出的结果是子类的属性值name呢?
父类引用指向子类对象并且有方法重写的时候,父类方法的地址指向会发生变化(从指向自己类的方法变化为指向创建对象的类所对应的方法),此时指向的是子类的方法,输出的是子类的属性。