不积跬步,无以至千里;不积小流,无以成江海。
Java语言基础
Java的抽象类
对子类中覆写方法进行约定,在抽象类中可以定义一些抽象方法以实现这样的约定,抽象方法指使用 abstract 关键字定义的并且没有提供方法体的方法,而抽象方法所在的类必须是抽象类,抽象类则必须使用 abstract 关键字定义。
定义一个抽象类:
abstract class Message{ private String type; public abstract String getConnectInfo(); // 抽象方法 public void setType(String type) { // 普通方法 this.type = type; } public String getType() { // 普通方法 return this.type; } }
当一个抽象类定义完成,切记:抽象类不是完整的类。
使用原则:
抽象类必须提供子类,子类使用 extends 继承一个抽象类;
抽象类的子类(不是抽象类)一定要覆写抽象类中的全部抽象方法;
抽象类的对象实例化可以利用对象多态性通过子类向上转型方式完成;
抽象类自己无法直接实例化。
abstract class Message{ private String type; public abstract String getConnectInfo(); // 抽象方法 public void setType(String type) { // 普通方法 this.type = type; } public String getType() { // 普通方法 return this.type; } } class DataMessage extends Message { @Override public String getConnectInfo() { // TODO Auto-generated method stub return "Oricle"; } } public class Test { public static void main(String[] args) { // TODO Auto-generated method stub Message mess = new DataMessage(); mess.setType("连接"); System.out.println(mess.getConnectInfo()); System.out.println(mess.getType()); } }
相关说明:
1. 定义抽象类时,不能使用 final 关键字定义,因为抽象类必须有子类;
2. 抽象类是作为一个普通类的加强版出现的(普通类基础上扩展而来,追加了抽象方法),所有抽象类一定可以提供有构造方法,并且子类也一定会按照子类对象的实例化原则进行父类构造调用。
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 DataMessage extends Message { public DataMessage(String type) { super(type); // TODO Auto-generated constructor stub } @Override public String getConnectInfo() { // TODO Auto-generated method stub return "Oricle"; } } public class Test { public static void main(String[] args) { // TODO Auto-generated method stub Message mess = new DataMessage("连接"); // mess.setType(); System.out.println(mess.getConnectInfo()); System.out.println(mess.getType()); } }
程序输出:
Oricle 连接
3. 抽象类中允许没有构造方法;
4. 抽象类中可以提供 static 方法,并且该方法不受到抽象类对象的局限。(static 方法永远不受到实例化对象或结构的限制,永远可以直接通过类名调用)。