一、抽象类的定义语法
抽象类指的是在普通类的结构里面增加抽象方法的组成部分(即有抽象方法的类一定是抽象类)。抽象方法没有方法体,同时还必须要使用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);
}
}
运行截图: