定义

类的设计应该确保父类包含它的子类的共同特征。有时候,一个父类设计得非常抽象,以至于它都没有任何具体的实例。这样的类称为抽象类(abstract class)。 java中被关键字abstract修饰的类就是抽象类,但是抽象类不能用于创建对象,抽象类可以包含抽象方法。

abstract class A{//定义一个抽象类
	
	public void fun(){//普通方法
		System.out.println("存在方法体的方法");
	}
	public abstract void print();//抽象方法,没有方法体,有abstract关键字做修饰
}

java中子类没有构造函数 java没有子类的类称为_抽象方法


因为抽象类必须有子类,而final定义的类不能有子类,所以抽象类不能用final声明。

注意点
  1. 抽象类和常规类一样,都有数据和方法,但是不能用 new 操作符创建抽象类的实例。抽象方法只有定义而没有实现,其实现由子类提供。
  2. 非抽象类中不能包含抽象方法。如果抽象类的子类没有实现所有被继承的父类抽象方法,就必须将该子类也定义为抽象类。
  3. 包含抽象方法的类必须是抽象类。但是,抽象类可以不包含抽象的方法。
  4. 即使父类是具体的,子类也可以是抽象的。
应用

模板设计模式:

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声明为抽象,只不过此时的该类不再可以实例化。当父类已有实际功能的方法时,该方法在子类中可以不必实现,直接引用的方法,子类也可以重写该父类的方法。