基于面向对象四大特性:抽象、封装、继承、多肽而言,定义类的过程就是抽象和封装的过程,而接口与抽象类则是对实体类进行更高层次的抽象,仅定义类的公共行为和特征。接口和抽象类的共同点是都不能被实例化,但可以定义引用变量指向实例对象。
由于java是单继承,因此抽象类在被继承时体现的时is-a关系,接口在被实现时体现的是can-do关系。由此可见,接口的出现完美的解决了java单继承的问题
与接口相比,抽象类通常是对同类事物相对具体的抽象,通常包含抽象方法、实体方法、属性变量。如果一个抽象类只有一个抽象方法,那它就等同于一个接口。is-a关系需要符合里氏代换原则,例如Eagle is Bird.Bird is an Object。 can-do关系需要符合接口隔离原则,实现类要有能力去实现并执行接口中定义的行为,例如Plane can fly.Bird can fly. 可以将fly定义为一个接口,Plane类和Bird类一起实现fly接口,而不是 把fly()作为一个抽象类的方法,再通过is-a的关系去继承抽象类。
从设计层面来说,抽象类是对类的抽象,是模板式设计,接口是对行为的抽象,是行为的规范,也可以说是一种契约式设计
在jdk1.8之前(不包含1.8),接口中不能有静态方法,而抽象类中因为有普通方法,所以也可以存在静态方法。
在JDK1.8及JDK1.8以后,抽象类中依旧可以有静态方法,同时,接口中也可以定义静态方法。
下面代码在JDK1.8以后是没有问题的!
public interface Demo(){
public static void print(){
system.out.println("Hello World");
}
}
PS:JDK1.7中,接口只包含抽象方法,用public abstract修饰
public interface Demo(){
public abstract void method();
}
在JDK1.8中,接口新增默认方法和静态方法:
默认方法:使用default修饰,在接口的实现类中可以直接调用,也可以复写该方法。
静态方法:使用static修饰,通过接口直接调用。
public interface Demo(){
//默认方法
public default void method(){
system.out.println("default method");
}
//静态方法
public static void print(){
system.out.println("static method");
}
}
在后面的JDK1.9中,接口新增了私有方法,用private修饰,私有方法可供接口内默认方法和静态方法调用
public interface Demo(){
private void method(){
System.out.println("Hello World!");
}
}
来源:CSDN
作者:qq_43126697
链接:https://blog.csdn.net/qq_43126697/article/details/104005988