Java—抽象类
目录
1、认识抽象类
2、使用抽象类的好处
编辑3、模版方法设计模式
1、认识抽象类
在Java中有一个关键字叫:abstract,它就是抽象的意思,可以用它修饰类,成员方法。
- abstract修饰类,这个类就是抽象类。
- abstract修饰方法,这个方法就是抽象方法。
抽象类和抽方法的格式
修饰符 bastract class 类名{
//抽象方法:必须abstract修饰,只有方法签名,不能有方法体
修饰符 abstract 放回值类型 方法名称(形参列表);
}
抽象类的注意事项
- 抽象类中不一定要有抽象方法,有抽象方法的类必须是抽象类。
- 类有的成员:成员变量、方法、构造器、抽象类都可以有。
抽象类最主要的特点:
- 抽象类不能创建对象,仅仅作为一种特殊的父类,让子类继承并实现。
- 一个类继承抽象类,必须重写完抽象类的全部抽象方法,否则这个类也必须定义成抽象类。
2、使用抽象类的好处
父类知道每个子类都要做某个行为,但每个子类要做的情况不一样,父类就定义成抽象方法,交给子类去重写实现,我们设计这样的抽象类,就是为了更好的支持多态。
Animal 类抽象类
public abstract class Animal {//动物的叫声,因为每个动物的叫声都不同,所以抽象方法。//好处一:简化方法体。public abstract void cry();
}
Cat类:继承了Animal抽象类重写了cry方法
public class Cat extends Animal{@Overridepublic void cry(){System.out.println("(>^ω^<)喵喵喵喵~~~");}
}
God类:继承了Animal抽象类重写了cry方法
public class God extends Animal{@Overridepublic void cry(){System.out.println("狗汪汪汪~~~");}
}
Test类:测试类
public class Test {public static void main(String[] args) {//使用抽象类的好处Animal animal = new Cat();animal.cry();}
}
/*
输出:
(>^ω^<)喵喵喵喵~~~*/
3、模版方法设计模式
- 提供一个方法作为完成某个类功能的模版,模版方法封装了每个实现步骤,但允许子类提供特定步骤的实现。
- 模版方法设计模式可以:提高代码的复用,并简化子类设计。
模版方法设计模式的写法步骤:
1、定义一个抽象类。
2、在里面定义2个方法
一个模版方法:把共同的实现步骤方里面去。
一个是抽象方法:不确定的步骤,交给具体的子类来拿完成。

下面举个例子分别用普通方法和模版方法设计模式类实现:老师和学生同写一篇作文,作文有一个模版,模版的第一段和第三段相同,写作文的时候只需要写第二段即可。
普通版本
Student 类
public class Student {public void write(){System.out.println("第一段相同");System.out.println("学生的第二段");System.out.println("第三段相同");}
}
Teacher 类
public class Teacher {public void write(){System.out.println("第一段相同");System.out.println("老师的第二段");System.out.println("第三段相同");}}
Test 类
public class Test {public static void main(String[] args) {Student s = new Student();s.write();}
}
/*
输出:
第一段相同
学生的第二段
第三段相同*/
模版方法设计模式类实现
People 类:抽象类
public abstract class People {public void write(){System.out.println("第一段相同");wrideMain();//调用抽象方法,在子类中重写了System.out.println("第三段相同");}public abstract void wrideMain();
}
Student 类:继承了People类
public class Student extends People{@Overridepublic void wrideMain() {System.out.println("学生的第二段");}
}
Teachar类:继承了People类
public class Teacher extends People{@Overridepublic void wrideMain(){System.out.println("老师的第二段");}
}
Test类:测试类
public class Test {public static void main(String[] args) {People s = new Student();s.write();}
}
/*
输出:
第一段相同
学生的第二段
第三段相同*/
多学一招
建议使用final关键字修饰模版方法,为什么?
- 模版方法是给子类直接使用的,不能被子类重写。
- 一但子类重写了模版方法,模版方法就失效了。
