1.继承
1.1 java继承概述
继承是面向对象的三大特征之一,可以使得子类具有父类的属性和方法,还可以在子类中重新定义,追加属性和方法。
继承是指在原有类的基础上,进行功能扩展,创建新的类型。
- 继承的本质是对某一批类的抽象,从而实现对现实世界更好的建模。
- JAVA中类只有单继承,没有多继承!
- 继承是类和类之间的一种关系。除此之外,类和类之间的关系还有依赖、组合、聚合等。
- 继承关系的两个类,一个为子类(派生类),一个为父类(基类)。子类继承父类,使用关键字extends来表示。
- 子类和父类之间,从意义上讲应该具有"is-a"的关系。
- extends的意思是“扩展”,子类是父类的扩展。
1.2 继承的格式
- 格式: public class 子类名 extends 父类名{}
- 例如: public class Zi extends Fu {}
- Fu:是父类,也被称为基类、超类
- Zi: 是子类,也被称为派生类
1.3 例
我们可以先创建个父类:
// 父类
public class Person {
public int date = 1;
public void name(){
System.out.println("姓名");
}
}
创建一个子类student:
//student is person
//student也叫派生类或者子类
//子类可以继承父类的所有方法
public class Student extends Person{
}
再创建main类来测试
public class Main {
public static void main(String[] args) {
Student student = new Student();
student.name();
System.out.println((student.date));
}
}
结果如下:
1.4 继承的优缺点
继承优点:
- 实现了数据和方法的共享
- 提高了代码的复用性(多个类相同的成员可以放到同一个类中)
- 提高了代码的维护性(如果方法的代码需要修改,修改一处即可)
- 提高了代码的可扩展性
继承缺点:
- 继承让类与类之间产生了关系,类的联合性增强了,当父类发生变化时子类实现也不得不跟着变化,削弱了子类的独立性
1.5 super
super 关键字的用法和 this 关键字的用法相似
- this:代表本类对象的引用(可以理解为代表本类对象的引用)
- super:代表父类存储空间的标识(可以理解为父类对象引用)
1.6 习题
我们可以先创建一个名为inheritance的包,将代码放在次包中
package inheritance;
import java.time.LocalDate;
public class Employee {
private final String name; // 姓名
private double salary; // 薪水
private final LocalDate hireDay; // 入职日期
public Employee(String name, double salary, int year, int month, int day) {
this.name = name;
this.salary = salary;
hireDay = LocalDate.of(year, month, day);
}
public String getName() {
return name;
}
public double getSalary() {
return salary;
}
public LocalDate getHireDay() {
return hireDay;
}
public void raiseSalary(double byPercent) {
double raise = salary * byPercent / 100;
salary += raise;
}
}
package inheritance;
public class Manager extends Employee {
private double bonus; // 奖金
public Manager(String name, double salary, int year, int month, int day) {
super(name, salary, year, month, day);
}
public double getSalary() {
double baseSalary = super.getSalary(); // 获取基本工资
return baseSalary + bonus; // 薪水=基本工资+奖金
}
public void setBonus(double bonus) {
this.bonus = bonus;
}
}
package inheritance;
public class ManagerTest {
public static void main(String[] args) {
// 创建一个Manager对象,固定工资为15000
Manager boss = new Manager("张三", 15000, 2019, 7, 1);
boss.setBonus(5000); // 设置额外5000奖金
Employee[] staff = new Employee[3];
// 用Manager对象以及Employee对象填充员工数组,这里涉及"多态",可自行预学
staff[0] = boss;
staff[1] = new Employee("李四", 5000, 2022, 7, 15);
staff[2] = new Employee("王五", 6500, 2023, 7, 15);
// 输出所有员工对象的信息
for (Employee e : staff) {
System.out.printf("name=%s,salary=%.2f\n", e.getName(), e.getSalary());
}
}
}