定义
类的设计应该确保父类包含它的子类的共同特征。有时候,一个父类设计得非常抽象,以至于它都没有任何具体的实例。这样的类称为抽象类(abstract class)。 java中被关键字abstract修饰的类就是抽象类,但是抽象类不能用于创建对象,抽象类可以包含抽象方法。
abstract class A{//定义一个抽象类
public void fun(){//普通方法
System.out.println("存在方法体的方法");
}
public abstract void print();//抽象方法,没有方法体,有abstract关键字做修饰
}
因为抽象类必须有子类,而final定义的类不能有子类,所以抽象类不能用final声明。
注意点
- 抽象类和常规类一样,都有数据和方法,但是不能用 new 操作符创建抽象类的实例。抽象方法只有定义而没有实现,其实现由子类提供。
- 非抽象类中不能包含抽象方法。如果抽象类的子类没有实现所有被继承的父类抽象方法,就必须将该子类也定义为抽象类。
- 包含抽象方法的类必须是抽象类。但是,抽象类可以不包含抽象的方法。
- 即使父类是具体的,子类也可以是抽象的。
应用
模板设计模式:
package test;
public class testAbstract {
public static void main(String[] args) {
fun(new Robot()); //传递机器人行为子类
fun(new Person()); //传递人类行为子类
fun(new Pig()); //传递猪行为子类
}
public static void fun(Action act){
act.command(Action.EAT);
act.command(Action.SLEEP);
act.command(Action.WORK);
}
}
abstract class Action{ //定义一个抽象的行为类,行为不是具体的
public static final int EAT = 1;
public static final int SLEEP = 2;
public static final int WORK = 4;
public void command(int flag){
switch (flag){
case EAT:this.eat();break;
case SLEEP:this.sleep();break;
case WORK:this.work();break;
}
}
//定义三个抽象方法
public abstract void eat();
public abstract void sleep();
public abstract void work();
}
class Robot extends Action{
//重写父类的抽象方法
public void eat() {
System.out.println("机器人靠充电补充能量");
}
public void sleep() {
}
public void work() {
System.out.println("机器人可以不停的工作");
}
}
class Person extends Action{
public void eat() {
System.out.println("人类靠吃饭补充能量");
}
public void sleep() {
System.out.println("人类需要睡觉");
}
public void work() {
System.out.println("人类需要工作");
}
}
class Pig extends Action{
public void eat() {
System.out.println("猪只知道吃");
}
public void sleep() {
System.out.println("猪吃完就睡");
}
public void work() {
}
}
而普通的JAVA类也可以在CLASS前加ABSTRACT声明为抽象,只不过此时的该类不再可以实例化。当父类已有实际功能的方法时,该方法在子类中可以不必实现,直接引用的方法,子类也可以重写该父类的方法。