目录
阐述
继承的概念
多个类存在相同的属性和行为时,将这些内容抽取到单独一个类中,那么这多个类无需再重复定义相同的属性和行为,只要继承那个类即可。
这个单独的类称为父类、基类或超类;这些多个类称为子类或派生类。
有了继承以后,我们在定义一个类的时候,可以在基类的基础上定义自己的新成员。
继承的好处和弊端
好处:
提高了代码的复用性
提高了代码的维护性
让类与类之间产生了关系,是多态的前提
坏处:
让类与类之间产生关系,也就是让类的耦合性增强了。我们的开发原则是 高内聚 低耦合,如果耦合性太高,将来再写代码容易影响到以前的代码。
拓展知识:
内聚:类独立完成功能的能力
耦合:两个类相互依赖于对方的程度
继承中方法重写的注意事项
五个注意事项:
1.用注解@Override表明该方法是重写父类的方法,虽然没有注解也不一定会报错,但是建议写上
2.父类的私用方法不能被重写
3.子类重写父类的方法时,访问权限不能更低,建议访问权限一模一样
4.子类重写方法时,如果想调用被重写方法,可以使用super关键字
5.重写方法的方法名、形参列表和返回值类型 必须和被重写方法一模一样
拓展知识:
访问权限由高到低—— public > protected > 默认(什么都不写)> private
多态的概念及前提
概念:某一个事物,在不同的时刻表现出不同的状态。
前提:(三点)
有继承关系
有方法重写
有向上转型
拓展知识:
向上转型:默认转型,从子到父,父类引用指向子类对象,即定义父类的变量,初始化的时候new子类的对象。该对象丢失子类特有的成员。
向下转型:需要强转,从父到子,父类引用转为子类对象。该对象找回子类特有的成员。
课后作业
分析以下需求,并用代码实现
1.定义项目经理类
属性: 姓名、工号、工资、奖金
行为: 工作work
2.定义程序员类
属性:姓名、工号、工资
行为:工作work
要求:向上抽取一个父类,让这两个类都继承这个父类,共有的属性写在父类中,子类重写父类中的方法
编写测试类:完成这两个类的测试
//测试类
public class TestDay07 {
public static void main(String[] args) {
Employee employee = new Employee("张三", "00a", 1000.0);
Manager manager = new Manager("李四", "11b", 50000.0, 10000.0);
Coder coder = new Coder("王五", "22c", 20000.0);
employee.work();
manager.work();
coder.work();
}
}
//父类
//所有的子类都有姓名工号工资,都需要工作
public class Employee {
private String name;
private String workId;
private double salary;
public Employee(String name, String workId, double salary) {
this.name = name;
this.workId = workId;
this.salary = salary;
}
public void work() {
System.out.println(name + "正在工作,TA的工号是" + workId + ",月薪" + salary + "元。");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getWorkId() {
return workId;
}
public void setWorkId(String workId) {
this.workId = workId;
}
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
}
//项目经理类
public class Manager extends Employee{
private double bonus;
public Manager(String name, String workId, double salary, double bonus) {
super(name, workId, salary);
this.bonus = bonus;
}
@Override
public void work() {
System.out.println("项目经理" + this.getName() + "正在工作,TA的奖金是" + bonus + "元。");
}
public void setBonus(double bonus) {
this.bonus = bonus;
}
public double getBonus() {
return bonus;
}
}
//程序员类
public class Coder extends Employee {
public Coder(String name, String workId, double salary) {
super(name, workId, salary);
}
@Override
public void work() {
System.out.println("程序员" + this.getName() + "正在工作,TA没有奖金。");
}
}