Java中抽象类和接口的区别
在Java实际开发中,抽象类和接口是开发设计中两个非常重要的设计环节,可是经常有人会将两者搞混,在碰到抽象类和接口都能用的情况下不知道该如何选择,为了帮助大家更好的理解这两者之间的概念,下面将会用总结的形式来将抽象类和接口进行对比。
关键字
一、抽象类的关键字
抽象类需要使用关键字abstract class进行定义,并且在一个抽象类中也可以利用abstract关键
字定义若干个抽象方法,这样抽象类的子类就必须在继承抽象类时强制覆写全部抽象方法。
定义抽象类:
abstract class Demo{ //定义抽象类
private String type; //定义成员变量
private abstract String getInfo(); //抽象方法
public void setType(String type){ //普通方法
this.type = type;
}
}
二、接口的关键字
在Java中接口属于一种特殊的类,需要使用关键字interface来进行定义,在接口中可以定义
全局常量、抽象方法(修饰符必须为public)、default方法以及静态方法。
定义标准接口
interface Demo{ //定义接口
public static final String INFO = "Hello World!"; //定义全局常量
public abstract String getter(); //定义抽象方法
}
关系
一、抽象类的关系:
一个抽象类可以实现多个接口,一个子类只能继承一个抽象类,即单继承。
范例:子类继承抽象类同时实现多个接口
interface IMessage{
public static final String INFO = "SCITC";
public abstract String getInfo();
}
interface IChannel{
public abstract boolean connect();
}
abstract class DatabaseAbstract implements IMessage,IChannel{
public abstract boolean getDatabaseConnection();
}
class Database extends DatabaseAbstract {
@Override
public String getInfo() {
if(this.connect()) {
if(this.getDatabaseConnection()) {
return "【Database Message】四川信息职业技术学院:www.scitc.cn";
}else {
return "Database连接失败";
}
}
return "【DefaultMessage】" + IMessage.INFO;
}
@Override
public boolean connect() {
return true;
}
@Override
public boolean getDatabaseConnection() {
return true;
}
}
public class Demo {
public static void main(String[] args) {
IMessage msg = new Database();
System.out.println(msg.getInfo());
}
}
程序运行结果:
【Database Message】四川信息职业技术学院:www.scitc.cn
二、接口的关系:
接口不能继承抽象类,却能继承多个接口。
范例:使用extends继承多个接口
interface Message{
public static final String INFO = "www.scitc.cn";
public abstract String getInfo();
}
interface Channel{
public boolean connect();
}
interface Service extends Message,Channel{
public String service();
}
class Database implements Service{
@Override
public String getInfo() {
return Message.INFO;
}
@Override
public boolean connect() {
return true;
}
@Override
public String service() {
return "DatabaseMessage:www.scitc.cn";
}
}
局限性
抽象类:一个子类只能够继承一个抽象类;
接口:一个子类可以实现多个接口。
结论
通过上面的观察可以得出结论:实际开发中,抽象类和接口是都能用得到的,具体使用哪一个也要视具体情况而定
并没有明确的限制。然而,抽象类有一个最大的缺点——一个子类只能继承一个抽象类,存在单继承的局限性,所以
当遇到抽象类和接口都能使用的情况时应该优先考虑接口以避免单继承的局限性。