一、抽象类的定义语法

    抽象类指的是在普通类的结构里面增加抽象方法的组成部分(即有抽象方法的类一定是抽象类)。抽象方法没有方法体,同时还必须要使用abstract关键字定义,同时抽象类也必须要用abstract定义。

定义一个抽象类:

abstract class A{
	public fun(String s) {
		System.out.println("普通方法");
	}
	//抽象方法
	public abstract void print();
}

因为抽象方法没有方法体,故抽象方法是不能被执行的,所以抽象类也就不能被实例化。

故抽象类的使用原则:

  • 抽象类必须有子类。
  • 抽象类的子类必须要覆写抽象类中的所有抽象方法。

二、抽象类的使用限制

  • 由于抽象类里面存在一些属性,所以在抽象类中一定会存在构造方法,目的:文科属性初始化,并且子类对象实例化的时候依然满足先执行父类构造,再调用子类构造的情况。
  • 抽象类不能使用final定义,因为抽象类必须有子类,而final定义的类不能有子类。
  • 外部的抽象类不允许使用static声明,而内部的抽象类允许使用static声明,使用static声明的内部抽象类就相当于一个外部抽象类,继承的时候使用“外部类.内部类”的形式表示类名称。

示例:

package project;
abstract class A{	//外部抽象类
	static abstract class B{      内部抽象类
		public abstract void print();
	}
}
class C extends A.B{
	public void print() {
		System.out.println("*********");
	}
}
public class Main {

	public static void main(String[] args){
		A.B ab = new C();
		ab.print();
	}
}
  • 任何情况下,如果要执行类中的static方法,都可以在没有对象的时候直接调用,对于抽象类也是一样。

三、抽象类的实际应用

完成一个抽象行为类,其中包括吃、睡、工作三种行为,然后完成三个类Robot、Human和Pig,继承行为类,可以实现不同类对象所执行的不同行为。

代码:

package project;
abstract class Action{	//行为抽象类
	public static final int EAT = 1;
	public static final int SLEEP = 5;
	public static final int WORK = 7;
	public void command(int flag) {
		switch(flag) {
			case EAT:
				this.eat();
				break;
			case SLEEP:
				this.sleep();
				break;
			case WORK:
				this.work();
				break;
			case EAT + SLEEP:
				this.eat();
				this.sleep();
				break;
		}
	}
	public abstract void eat();
	public abstract void sleep();
	public abstract void work();
}
class Robot extends Action{    //机器人类

	@Override
	public void eat() {
		// TODO Auto-generated method stub
		System.out.println("机器人正在补充能量!");
	}

	@Override
	public void sleep() {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void work() {
		// TODO Auto-generated method stub
		System.err.println("机器人正在努力工作!");
	}
	
}
class Human extends Action{    //人类类

	@Override
	public void eat() {
		// TODO Auto-generated method stub
		System.out.println("人类正在吃饭!");
	}

	@Override
	public void sleep() {
		// TODO Auto-generated method stub
		System.out.println("人类正在睡觉!");
	}

	@Override
	public void work() {
		// TODO Auto-generated method stub
		System.out.println("人类正在为了梦想努力工作!");
	}
	
}
class Pig extends Action{    //猪类

	@Override
	public void eat() {
		// TODO Auto-generated method stub
		System.out.println("猪正在啃食槽!");
	}

	@Override
	public void sleep() {
		// TODO Auto-generated method stub
		System.out.println("猪正在睡觉!");
	}

	@Override
	public void work() {
		// TODO Auto-generated method stub
		
	}
	
}
public class Main {

	public static void main(String[] args){
		fun(new Robot());
		fun(new Human());
		fun(new Pig());
	}
	public static void fun(Action act) {
		act.command(Action.EAT);
		act.command(Action.SLEEP);
		act.command(Action.WORK);
	}
}

运行截图:

JAVA定义var Java定义抽象类_抽象类