关于“继承, 子类拥有父类非private的属性和方法“

我们以前经常看到这么一句话: "继承,  子类拥有父类非 private 的属性和方法。";

但是我们又会经常看到这样的代码

父类:

public class People {
    private String name;
    private Integer age;

    public People(){};

    public People(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    private void show(){
        System.out.println("世界, 你好!");
    }

    @Override
    public String toString() {
        return "People{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

子类

public class Teacher extends People{
    private Integer classId;
    private static People people = new People("root", 18);

    public Teacher(Integer classId) {
//        super();
        this.classId = classId;
    }

    public Teacher(){
//        super();
    }

    public static void change(){
        people.setName("张三");
        people.setAge(20);
        System.out.println(people.toString());
    }

    public Integer getClassId() {
        return classId;
    }

    public void setClassId(Integer classId) {
        this.classId = classId;
    }

    @Override
    public String toString() {
        return "Teacher{" +
                "classId=" + classId +
                '}';
    }
}

测试类

public class App {
    public static void main(String[] args) {
        Teacher teacher = new Teacher();
        teacher.setAge(20);
        teacher.setName("wolf");
        teacher.setClassId(1);
        System.out.println(teacher);
        System.out.println(teacher.getAge());
        System.out.println(teacher.getName());
        System.out.println(teacher.getClassId());
    }
}

执行结果

分析

在这里我们会看到teacher对象好像是有age, name属性, 额, 这是怎么回事呢? 难道上面那句话是错的?

其实这里不能这么想, 这里在实例化子类对象的时候, 调用了子类的无参数构造器, 而子类的无参数构造器其实又调用了父类的无参数构造器(super(); 这里其实可以不写),所以也同样实例化了父类对象,而对于子类这种teacher.setAge(20), teacher.setName("wolf") 其实是调用了父类的set方法来对属性进行赋值的, 因为父类的set方法都是public修饰的, 继承过程中是可以继承public修饰的属性和方法的(private修饰的是不可以继承的, 你看父类People的show()方法就是不能直接被子类继承过去的),  teacher是有这些方法的, 所以teacher是可以直接调用的, 所以可以直接给父类的age, name属性进行赋值. 因此并不能说age,name是teacher的属性, 你看后面打印teacher的过程中, 就没有出现age,name两个属性, 而调用get方法能得到属性的值也是同样的道理, 因为get方法也是public修饰的, 所以子类可以直接调用, 从而得到父类属性的值.

猜你喜欢

转载自blog.csdn.net/m0_50370837/article/details/123950237