大神给我说说 面向对象继承

图片

分析原因:因为父类定义了name,子类如果直接继承Person类就自动也拥有了属性name。
但是子类也定义了一个相同名称的name属性,那么子类Person对象本质上就有了两个name属性,一个是自己的,一个是父类的,这两个同名属性都会在类实例化时分配空间。
shout方法中打印的是父类的name属性,所以结果就是person.
如果想要有多态特性,根据实际的类型打印对应的name属性,那么需要去掉Student类中的name定义。修正代码如下:

 public class Student extends Person{
//  String name = "student";
    String school = "school";

    public Student(){
        this.name = "student";
    }
    public static void main(String[] args) {
        Person p  = new Student();
        p.shout();
    }

}

这样打印的就是子类的name了。

子类中并没有shout方法,所以去父类中找到shout方法并输出name,,肯定是父类中的name