abstract
没有方法体
public void eat();
abstract方法不能是private 因为abstract方法就是要重写的, 你用了private子类没权限了还怎么重写?
注意事项
- 有抽象方法的一定是抽象类,但抽象类不一定有抽象方法
- 抽象类不能创建对象,仅作为一种特殊的父类,让子类继承并实现
- 子类继承抽象类,必须重写抽象类的全部抽象方法,否则这个类也必须定义成抽象类
好处
更好满足多态
父类知道子类都要做某个行为。每个子类都必须实现这个方法。
当用父类创建对象时
Animal animal = new Dog();
animal.setName("82");
animal.eat();
代码
模板方法
父类定义子类一定要重写的方法为abstract抽象方法。
父类Dog.java
模板方式是让所有子类都要一致的,加上final,防止其他子类重写(防止修改)
/**
* @Author: ggdpzhk
* @CreateTime: 2024-08-13
*/
public abstract class Dog {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Dog(String name) {
this.name = name;
}
public Dog() {
}
public final void writeAll() {
System.out.println("《我的狗》");
System.out.println("我的狗叫"+name);
System.out.println(write());
System.out.println("我很爱我的狗");
}
public abstract String write();
}
子类
两个学生写关于狗的作文
StudentA.java
/**
* @Author: ggdpzhk
* @CreateTime: 2024-08-13
*/
public class StudentA extends Dog {
@Override
public String write() {
return "我的狗很能吃";
}
}
StudentB.java
/**
* @Author: ggdpzhk
* @CreateTime: 2024-08-13
*/
public class StudentB extends Dog{
@Override
public String write() {
return "我的狗很白很能跑撞人很有劲";
}
}
Test.java
/**
* @Author: ggdpzhk
* @CreateTime: 2024-08-13
*/
public class Test {
public static void main(String[] args) {
StudentA studentA = new StudentA();
studentA.setName("地雷");
studentA.writeAll();
StudentB studentB = new StudentB();
studentB.setName("旺财");
studentB.writeAll();
}
}
运行结果
模板方法总结
模板方法解决了方法中代码重复的问题
怎么写
- 定义一个抽象类(父类)
- 在里面定义两个方法:一个是模板方法(建议用final关键字修饰):放相同的代码;一个是抽象方法,具体的实现交给子类完成。