什麽是抽象类?
- 在java中有一个关键字叫:abstract,它就是抽象的意思,可以用它修饰类、成员方法
- abstract修饰类,这个类就是抽象类;修饰方法,这个方法就是抽象方法
认识抽象类
抽象类的注意事项、特点
- 抽象类中不一定有抽象方法,有抽象方法的类一定是抽象类
- 类该有的成员(变量、方法、构造器)抽象类都可以有
- 最主要的特点:抽象类不能创建对象,仅作为一种特殊的父类,让子类继承并实现
- 一个类继承抽象类,必须完全重写完抽象类的全部抽象方法,否则这个类也必须定义成抽象类
使用抽象类的好处
- 父类知道每个子类都要做某个行为,但每个子类要做的情况不一样,父类就定义成抽象方法,交给子类去重写实现,设计这样的抽象类,就是为了更好的支持多态
示例:
需要设计猫和狗类,它们都有自己的名字,猫会喵喵叫,狗会汪汪叫
抽象宠物类:
public abstract class Pet { //定义抽象类
private String name; //名字
public abstract void cry(); //发出叫声方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
猫类:
public class Cat extends Pet { //猫类,继承宠物抽象类
@Override
public void cry() { //重写方法
System.out.println(getName()+":喵喵喵~");
}
}
狗类:
public class Dog extends Pet{ //狗类,继承宠物抽象类
@Override
public void cry() { //重写方法
System.out.println(getName()+":汪汪汪~");
}
}
Test:
public class Test {
public static void main(String[] args) {
Pet c = new Cat();
c.setName("武斗酷猫");
c.cry(); //更好的支持多态
Pet d = new Dog();
d.setName("音速犬");
d.cry();
}
}
运行结果:
抽象类的常见应用场景:模板方法设计模式
模板 方法设计模式解决了什么问题?
- 解决了方法中存在重复代码的问题
模板方法设计模式的写法
- 定义一个抽象类
- 在里面定义2个方法:一个是模板方法,把相同代码放进去,一个是抽象方法,把具体实现交给子类完成
- 建议使用final关键字修饰模板方法,避免子类重写模板
示例:
比如用模板方法设计模式完成刚才的问题
抽象宠物类:
public abstract class Pet { //定义抽象类
private String name; //名字
public void cry(){ //模板方法
System.out.print(getName()+"发出了");
voice(); //主体部分交给子类完成
System.out.println("的叫声");
}
public abstract void voice(); //发出叫声方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
猫类:
public class Cat extends Pet { //猫类,继承宠物抽象类
@Override
public void voice() { //主体部分由子类确定发出什么声音
System.out.print("喵喵喵~");
}
}
狗类:
public class Dog extends Pet{ //狗类,继承宠物抽象类
@Override
public void voice() { //主体部分由子类确定发出什么声音
System.out.print("汪汪汪~");
}
}
Test:
public class Test {
public static void main(String[] args) {
Pet c = new Cat();
c.setName("武斗酷猫");
c.cry();
Pet d = new Dog();
d.setName("音速犬");
d.cry();
}
}
运行结果:
这个例题代码量太少可能看不出什么效果,当代码量多的时候就可以体现出减少重复代码的优势了