抽象类的定义与使用
类继承的主要作用在于可以扩充已有类的功能,但是对于之前的继承操作而言会发现,子类可以有自己决定是否覆写某一个方法,这个时候父类无法对子类做出强制性约定(强制必须覆写某一个方法),这个时候往往不会采用类的继承(在实际开发之中很少会出现继承一个已经完善的类,可以直接使用的类),而是必须继承抽象类,以后在设计父类的时候一定优先考虑抽象类。
抽象类的基本定义
抽象类的主要作用在于对于子类中覆写方法进行约定,在抽象类里面可以去定义一些抽象方法以实现这样的约定,抽象方法指的是使用了我们 abstract 关键字定义的并且没有提供方法体的方法,而抽象方法所在的类必须为抽象类,抽象类必须使用关键字abstract 定义(在普通类的基础上追加抽象方法就是抽象类)。
定义一个抽象类
abstract class Message { //定义抽象类
public String type; //消息类型
public abstract String getConnectInfo(); //抽象方法
public void setType(String type) {
this.type = type;
}
public String getType() {
return this.type;
}
}
class DatabaseMessage extends Message {
public String getConnectInfo() {
return "Oracle数据库的链接信息。";
}
}
public class JavaDemo {
public static void main(String args[]) {
Message msg = new DatabaseMessage();
msg.setType("客户消息");
System.out.println(msg.getConnectInfo());
System.out.println(msg.getType());
}
}
当一个抽象类定义完成之后,切记“抽象类不是完整的类”,如果想使用抽象类必须遵循以下原则:
- 抽象类必须提供有子类,子类使用extends继承一个抽象类;
- 抽象类的子类(不是抽象类)一定要覆写抽象类中的全部抽象方法;
- 抽象类的对象实例化可以利用对象多态性通过子类向上转型的方式
从整体上来讲,抽象类只是比普通类增加了抽象方法以及对子类的强制性的覆写要求而已,其他的使用过程和子类的使用方法完全相同。
对抽象类使用的几点意见:
- 抽象类使用很大程度上有一个核心的问题:抽象类自己无法直接实例化;
- 抽象类之中主要的目的是进行过渡操作使用,所以当你使用抽象类进行开发的时候,往往都是在你设计中需要解决类继承问题时所带来的代码重复处理。
抽象类相关说明
抽象类是一个重要的面向对象设计的结构,对于抽象类使用的时候需要注意以下几点:
-
在定义抽象类的时候绝对不能够使用final关键字来进行定义,因为抽象类必须有子类,而final定义的类是不能够有子类的
-
抽象类是作为一个普通类的加强版出现的(抽象类的组成就是在普通类的基础上扩展而来的,只是追加了抽象方法),在普通类基础上扩展的,那么普通类之中就可以定义属性和方法,那么这些属性一定是要进行内存空间开辟的,所以抽象类中一定可以提供有构造方法,并且子类也一定会按照子类对象的实例化原则进行父类构造方法调用。
abstract class Message {
private String type;
public Message(String type){
this.type = type;
}
public abstract String getConnectInfo();
public void setType(String type) {
this.type = type;
}
public String getType() {
return this.type;
}
}
class DatabaseMessage extends Message {
public DatabaseMessage(String type) {
super(type);
}
public String getConnectInfo() {
return "Oracle数据库的链接信息。"
}
}
public class JavaDemo {
public static void main(String args[]) {
Message msg = new DatabaseMessage("客户信息");
System.out.println(msg.getConnectInfo());
System.out.println(msg.getType())
}
}
- 抽象类中允许没有抽象方法,但是即便没有抽象方法,也无法直接使用关键字new直接实例化对象
abstract class Message {
public abstract String getConnectInfo();
public static Message getInstance() {
return new DatabaseMessage();
}
}
class DatabaseMessage extends Message {
public String getInfo() {
return "Oracle数据库的链接信息。"
}
}
public class JavaDemo {
public static void main(String args[]) {
Message msg = Message.getInstance();
System.out.println(msg.getInfo());
}
}
static 方法永远不受到实例化对象或结构的限制,永远可以直接通过类名称进行调用
抽象类的应用
抽象类的本质上就属于一个加强型的类,可以描述一切的有关的现实事物,但是通过分析也可以发现,抽象类的设计应该是比普通类更高一层的定义。那么下面来研究一下抽象类的实际应用。
假如说现在要描述有三类的事物:
- 机器人:不休息,只知道不同能量和工作。
- 人类:需要休息,需要吃饭,需要工作。
- 猪: 需要进食和休息。!
类图
abstract class Action {
public static final int EAT = 1 ;
public static final int SLEEP = 5 ;
public static final int WORK= 10 ;
pubic 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() ;
}
}
}
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() {}
}
public class JavaDemo {
public static void main(String arg[]) {
Action robotAction = new Robot();
Action personAction = new Person();
Action pigAction = new Pig();
robotAction.command(Action.EAT);
robotAction.command(Action.WORK);
personAction.command(Action.EAT);
personAction.command(Action.WORK);
personAction.command(Action.SLEEP);
pigAction.command(Action.EAT);
pigAction.command(Action.SLEEP);
}
}
定义Action 父类主要目的是: 对所有行为规范进行统一处理。抽象类最大的好处一是对子类方法的统一管理,二是可以自身提供有一些普通方法并且这些普通方法可以调用普通类所提供的实现。