抽象类
1概念
如果一个类中没有包含足够的信息来描绘一个具体的对象,那么这样的类就是抽象类。抽象类中包含了抽象方法,并且使用了abstract关键字来定义。
抽象方法:使用了abstract关键字来定义,并且没有提供方法体的方法。
abstract class Message{
public abstract String getConnectInfo();
}
2抽象类无法实例化,必须要提供有子类,子类必须要覆写抽象类中的所有抽象方法。
abstract class Action {
public abstract void eat();
public abstract void sleep();
}
class Persion extends Action {
public void eat() {
System.out.println("安静的坐下吃饭");
}
public void sleep() {
System.out.println("安静的睡觉");
}
}
3抽象类的对象实例化可以通过子类向上转型来完成。
Action per =new Persion;
4抽象类的最大好处一是对子类方法的统一管理,二是可以自身提供一些普通方法可以调用抽象方法。
定义抽象类及其子类:
abstract class Action {
public static final int EAT = 1;
public static final int SLEEP = 5;
public static final int WORK = 10;
public void command(int code) {
switch (code) {
case EAT:
this.eat();
break;
case SLEEP:
this.sleep();
break;
case WORK:
this.work();
break;
case EAT + SLEEP + WORK:
this.eat();
this.sleep();
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 Persions 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() {}
}
进行实例化:
public class AbstractClass {
public static void main(String[] args) {
Action robotaction = new Robot();
Action persionaction = new Persions();
Action pigaction = new Pig();
System.out.println("-----------机器人行为-------------");
robotaction.command(Action.EAT);
robotaction.command(Action.WORK);
System.out.println("-----------人类的行为--------------");
persionaction.command(Action.EAT);
persionaction.command(Action.SLEEP);
persionaction.command(Action.WORK);
System.out.println("------------猪的行为----------------");
pigaction.command(Action.EAT);
pigaction.command(Action.SLEEP);
}
}
输出结果:
5注意事项
抽象类中可以没有抽象方法,但是即便没有抽象方法,抽象类依旧无法自己实例化
抽象类中允许有static方法,并且该方法不受抽象类对象的限制
抽象类和普通类相比,只是增加了抽象方法和对子类的强制性覆写的要求。