1.抽象类的定义与使用
定义:抽象类只是在普通类的基础上多扩充了一些抽象方法而已。
抽象方法:指的是只声明而未实现的方法,(没有方法体)
所有抽象方法要求使用abstract来定义,并且抽象方法所在的类也一定要使用abstract来定义,表示抽象类。
2.抽象类的使用原则
看一道例题:
abstract class A{
public A(){
//3.调用父类构造
this.print() ; //4.调用被子类覆写的方法
}
public abstract void print() ;
}
class B extends A{
private int num = 100 ;
public B(int num) {
//2.调用子类实例化对象
super() ; //3.隐含一行语句,实际要先调用父类构造
this.num = num ; //7.为类中属性初始化,30
}
public void print() {
//5.此时子类对象的属性还没有被初始化
System.out.println(this.num) ; //6.对应其数据类型的默认值,输出0
}
}
public class Test{
public static void main(String[] args) {
new B(30).print(); //1.实例化子类对象
}
}
调用过程:1234567
输出:
抽象类的使用原则:
a. 所有的抽象类必须有子类(abstract与final不能同时使用)
b. 抽象类的子类必须覆写抽象类的所有抽象方法(abstract与private也不能同时使用)
c. 抽象类要想创建实例化对象,必须通过子类向上转型为其实例化。(抽象类无法创建实例化对象)
abstract class Person {
private String name;
private String getName(){
return name;
}
public abstract void fun();
}
class Student extends Person{
public void fun(){
System.out.println("子类继承抽象类");
}
}
public class Test{
public static void main(String[] args){
Person per = new Student();
per.fun();
}
}
3.抽象类的相关规定
a. 抽象类也允许提供构造方法,并且子类也照样遵循对象实例化流程,先调用父类的调用方法而后调用子类构造方法
b. 抽象类中不允许定义任何的抽象方法,但抽象类依然无法直接创建实例化对象。
c. abstract与final不能一起用;abstract与private也不能一起用;
d. 内部抽象类(了解)
内部抽象类中也可以使用static定义来描述外部抽象类。如果现在外部抽象类中使用了static那么就是语法错误,但是内部抽象类允许使用static。
4.模板设计模式(封装算法)
-------基于抽象类,核心是封装算法。
看一个例子:
咖啡冲泡法
- 将水煮沸
- 用沸水冲泡咖啡
- 将咖啡倒进杯子
- 加糖和牛奶
茶冲泡法
- 将水煮沸
- 用沸水浸泡茶叶
- 把茶倒进杯子
- 加柠檬
class Coffee {
/*
咖啡冲泡法(算法)
*/
void prepareRecipe() {
boilWater();
brewCoffeeGrings();
pourInCup();
addSugarAndMilk();
}
/**
* 将水煮沸
*/
// 重复代码
public void boilWater() {
System.out.println("Boiling Water");
}
/**
* 冲泡咖啡
*/
public void brewCoffeeGrings() {
System.out