文章目录
一、继承
1、背景
代码中创建的类,主要是对现实事物的抽象描述,其中包含属性和方法。但是客观事物之间可能会存在一些联系,那么在代码中类和对象也存在一定的关联。
例如:设计图书类
class Book {
public String title;
public double price;
Book(String title,double price){
this.title = title;
this.price = price;
}
public void information(){
System.out.println("【图书】书名:" + this.title + " 价格:" + this.price);
}
}
class MathBook{
public String title;
public double price;
MathBook(String title,double price){
this.title = title;
this.price = price;
}
public void information(){
System.out.println("【数学书】书名:" + this.title + " 价格:" + this.price);
}
public void clac(){
System.out.println("数学公式");
}
}
class EnglishBook{
public String title;
public double price;
EnglishBook(String title,double price){
this.title = title;
this.price = price;
}
public void information(){
System.out.println("【数学书】书名:" + this.title + " 价格:" + this.price);
}
public void story(){
System.out.println("英语小故事");
}
}
通过观察代码可以发现,这些类中有很多重合的部分,这样的代码设计可以说是非常糟糕。那么怎么解决呢?① 从客观角度来讲,无论数学书还是英语书都属于图书;② 数学书类和英语书类中的属性和information()方法完全和图书类中的相同。基于以上两点,可以使用继承解决代码重用的问题。
此时Book被继承的类,称为父类,基类或者超类,对于MathBook和EnglishBook类,称为子类,派生类。子类会继承父类的属性和方法(构造方法除外),以达到代码重用的效果。
这时我们就会发现另外一个问题:该代码中的属性并没有进行封装,那么封装之后还能进行继承吗?答案是可以的。只是此时虽然被继承了,但是子类不能直接对属性进行访问,需要通过父类中的getter方法进行访问。
2、使用规则
class 子类 extends 父类 {
}
说明:
① 关键字extends表示继承,指定要继承的父类;
② Java中的一个子类只能继承一个父类;
③ 子类若是需要调用父类中的方法,可以使用super关键字得到父类实例的引用,以下是super的三种用法。
super() | super.属性 | super.方法() |
---|---|---|
调用父类构造方法,必须放在首行 | 调用父类成员属性 | 调用父类方法 |
例:对图书类的优化
class Book {
public String title;
public double price;
Book(String title,double price){
this.title = title;
this.price = price;
}
public void information(){
System.out.println(