为什么需要有继承:
列如:小学生,中学生,大学生,他们都有姓名,年龄,学号的属性,交学费的行为。
我们可以把这些相同的属性和行为抽取出来放到单独的一个学生类中,小学生,中学生,大学生只需要继承学生类就可以了
这样大大减少了代码量
总结,类是对象的抽象,继承是对某一批类的抽象
继承的格式:
通过extends关键字可以实现类与类的继承
class 子类类名 extends 父类类名 { }
被继承的这个类称为父类,基类或者超类
继承的这个类称为子类或者派生类
继承的理解:
1.继承是对一批类的抽象
2.继承本质上就是向上抽取代码,也就是说如果多个类出现了重复代码,
我们可以定义一个类来存储这些重复代码,并且给类取个名字就可以了
继承的好处:
1.简化代码
2.提高代码的可维护性和可扩展性
3.让类与类之间产生关系,这是多态的必要条件
继承的缺点:
开发设计的原则:高内聚,低耦合
类与类之间的关系不要太高,尽量保证类与类之间的独立性
1.造成耦合过高
2.牵一发而动全身
继承要慎用
继承的特点:
1.单一继承性(一个儿子只能有一个爸爸)
2.Java支持多层继承,不支持多继承
3.如果一个父类的成员变量使用private关键字修饰,那么对子类的成员不可见
一般父类的成员用protected和public修饰
4.如果一个子类不仅可以继承父类的所有公共方法和属性,还可以有自己的方法
5.子类不能继承父类的构造方法
什么时候使用继承:
1.存在公共代码
2.A is a B
如何使用继承:
1.先书写子类
2.观察多个子类之间是否存在公共代码
3.存在就将公共代码抽取出来,放置在父类中
4.将子类继承父类
5.将子类的公共代码删除
有农民(farmer),教师(teacher),科学家(scientist),服务生(attendant),其中农民,服务生只有基本工资,教师除基本工资外,还有课酬(元/天),科学家除基本工资外,还有年终奖,
请你写出相关类,将各种类型的员工的全年工资打印出来。
package com.sxt;
public class ExtendsDemo01 {
public static void main(String[] args) {
Famer f = new Famer(3000);
Teacher t = new Teacher(3000, 50000);
Scientist s = new Scientist(10000, 100000);
Attendant a = new Attendant(2000);
f.printAllYearSalsry();
t.printAllYearSalsry();
s.printAllYearSalsry();
a.printAllYearSalsry();
}
}
class Worker {
double basicSalary;
public Worker() {}
public Worker(double basicSalary) {
this.basicSalary = basicSalary;
}
public void printAllYearSalsry() {
System.out.println("全年工资为:" + (basicSalary * 12));
}
public double getBasicSalary() {
return basicSalary;
}
public void setBasicSalary(double basicSalary) {
this.basicSalary = basicSalary;
}
}
class Famer extends Worker{
public Famer() {}
public Famer(double basicSalary) {
this.basicSalary = basicSalary;
}
}
class Teacher extends Worker{
private double courseFee;
public Teacher() {}
public Teacher(double basicSalary, double courseFee) {
super(basicSalary);
this.courseFee = courseFee;
}
public void printAllYearSalsry() {
System.out.println("全年工资为:" + (basicSalary * 12 + courseFee));
}
public double getCourseFee() {
return courseFee;
}
public void setCourseFee(double courseFee) {
this.courseFee = courseFee;
}
}
class Scientist extends Worker{
private double yearBouns;
public Scientist() {}
public Scientist(double basicSalary, double yearBouns) {
super(basicSalary);
this.yearBouns = yearBouns;
}
public void printAllYearSalsry() {
System.out.println("全年工资为:" + (basicSalary * 12 + yearBouns));
}
public double getYearBouns() {
return yearBouns;
}
public void setYearBouns(double yearBouns) {
this.yearBouns = yearBouns;
}
}
class Attendant extends Worker{
public Attendant() {}
public Attendant(double basicSalary) {
this.basicSalary = basicSalary;
}
}