
1.继承的介绍与使用继承让类与类之间产生关系子父类关系子类可以直接使用父类中非私有的成员场景现在需要编写三个类描述程序员项目经理人事属性为姓名年龄工资可以发现三个类中的属性完全一样重复编写就非常麻烦这时我们可以抽取一个共同的父类 Employee将共性内容定义在父类中再让三个子类继承 Employee复用性就提高了。格式public class Employee { String name; // 姓名 int age; // 年龄 double salary; // 工资 }public class Coder extends Employee { } public class Manager extends Employee { } public class Hr extends Employee { }public class Test { public static void main (String[] args){ Coder c new Coder(); c.name 张三; c.age 23; c.salary 10000; Manager a new Manager(); a.name 李四; a.age 24; a.salary 15000; Hr h new Hr(); h.name 王五; h.age 25; h.salary 7000; } }可以发现父类中非私有的属性子类是可以直接使用的。问题按照标准的 JavaBean 要求成员变量是需要私有的那子类怎么使用呢回答私有成员变量后我们还会提供对应的 setXxx 和 getXxx 方法这些方法是 public 公共的子类可以调用这些方法解决问题。package com.itheima.mextends; public class ExtendsDemo1 { public static void main(String[] args) { Coder c new Coder(); c.setName(张三); c.setAge(23); c.setSalary(12000); System.out.println(c.getName() --- c.getAge() --- c.getSalary()); } } class Employee { private String name; private int age; private double salary; public void work() { System.out.println(员工工作); } public String getName() { return name; } public void setName(String name) { this.name name; } public int getAge() { return age; } public void setAge(int age) { this.age age; } public double getSalary() { return salary; } public void setSalary(double salary) { this.salary salary; } } class Coder extends Employee { } class Manager extends Employee { }使用场景好处与弊端好处提高了代码的复用性维护性弊端类和耦合性增强了继承的学习路径2.继承中成员变量的访问特点思考子父类中如果出现了重名的成员变量使用的时候会优先使用this调用本类成员super调用父类成员3.方法重写思考子类继承了父类之后如果编写的方法结构和父类相同但是方法内逻辑不相同创建子类对象调用方法的时候执行的是父类方法逻辑还是子类方法逻辑答案子类方法逻辑但这不是就近原则是子类的方法对父类方法进行了重写。介绍在继承体系中子类可以继承到父类的方法但有时子类并不想原封不动地继承父类的方法而是想作一定的修改这就需要采用方法的重写方法重写又称方法覆盖要求子类重写父类方法需要保证方法声明完全一致方法名参数返回值类型需要保持一致举例package com.itheima.mextends; public class ExtendsDemo3 { /* 方法重写的使用场景: 子类继承了父类的方法, 但是子类不想原封不动的继承父类的方法逻辑 想要修改或者是增强, 就可以重写父类方法. 方法重载(Overload): 在同一个类中, 方法名相同, 参数不同, 与返回值无关 参数不同: 个数不同, 类型不同, 顺序不同. 方法重写(Override): 在子父类中, 出现了方法声明完全一致的方法 (方法名, 参数, 返回值都需要和父类保持一致) */ public static void main(String[] args) { Son s new Son(); s.love(); } } class Father { void love() { System.out.println(送花); System.out.println(送自行车); System.out.println(送冰箱); } } class Son extends Father { Override // Override注解: 校验当前方法, 是否是重写的方法 public void love() { super.love(); System.out.println(送口红); System.out.println(送包); } }使用 Override 注解可以校验当前方法, 是否是重写的方法重写方法的使用可以使用 Ctrl O 的快捷键查看父类中有哪些方法可以重写注意事项父类中私有方法不能被重写子类重写父类方法时访问权限必须大于等于父类4.权限修饰符-protectedprotected 是在默认修饰符的基础上多了一级 不同包的子类我们搞清楚这一点学会了该修饰符了。今后用的最多的权限修饰符还是 private 和 publicprotected了解即可。5.Java中继承的特点Java只支持单继承不支持多继承但是支持多层继承问题为什么不支持多继承回答如果支持多继承假设多个父类中有相同的方法结构逻辑却不同子类不知道该使用谁的逻辑问题为啥多层继承可以回答多层继承的话子类会知道使用重写后的方法逻辑6.继承成员访问特点-构造方法构造方法不能继承子类需要手动编写自己的构造方法原因构造方法要求方法名与类名相同如果继承了父类的构造方法就无法与类名相同了问题子类在初始化之前是否需要先完成父类的初始化回答需要因为子类在初始化的时候很有可能要用到父类中的数据如果父类没有提前完成初始化子类将无法使用父类数据问题子类是如何完成父类初始化的呢线索什么方法是用于对象初始化的?回答构造方法所以子类只要有办法调用到父类的构造方法就能完成父类初始化在所有的构造方法中都默认隐藏了一句话 super();通过这句代码来访问父类的空参构造方法super(); 可以调用父类的空参数构造方法super(name, age); 我们可以传入参数手动调用父类的带参数构造方法从而完成数据的初始化7.this和super关键字小提示this() super() 二者都在争夺构造方法的第一行位置所以二者不能共存细节补充当我们使用 super 调用父类成员的时候如果调用的成员在子类中不存在super. 可以省略不写.