1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > 关于“继承 子类拥有父类非private的属性和方法“

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

时间:2020-06-10 17:49:35

相关推荐

关于“继承  子类拥有父类非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("世界, 你好!");}@Overridepublic 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;}@Overridepublic 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修饰的, 所以子类可以直接调用, 从而得到父类属性的值.

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。