原文:抽象类和接口的区别已经变了java
随着JDK的不断迭代,抽象类和接口的区别已经有了些许改变,你是否还停留在JDK 7 的答案呢?面试
public abstract class A {}
复制代码
public abstract interface A {}
复制代码
public abstract class A {}
public class B extends A {}
复制代码
public interface A {}
public interface B {}
public interface C extends A {}
public class D implements B,C {}
复制代码
public abstract class A {
public A () {}
}
复制代码
public interface A {
//默认(public static final) String A="ABC";
String A = "ABC";
}
复制代码
//任意访问修饰符的变量及常量
public abstract class A {
private String a = "a";
boolean b = true;
public char c = 'a';
protected int d = 2;
public static final int e = 1;
}
复制代码
抽象类中能够和普通类中同样拥有各自普通方法,也能够拥有(没必要须)抽象方法。微信
public abstract class A {
// protected or default
public abstract void a();
}
复制代码
抽象方法的目的就是为了让子类继承重写的,因此抽象方法不能私有,不能final修饰。架构
public interface A {
//默认(public abstract) void test();
void test();
}
复制代码
public interface A {
// 这里的 default 不能省略
public(默认自动添加) default void defaultMethod(){
//do something
}
}
复制代码
默认方法的出现主要是面向类库的开发者的,在堆接口进行扩展时,大量的实现类会让人望而却步。拥有默认方法后,子类可直接继承使用或重写。另外,添加默认方法不会影响函数式接口的使用。ide
public interface A {
// 静态方法
public(默认自动添加) static void staticMethod(){
//do something
}
}
复制代码
静态方法的调用直接经过接口名调用
A.staticMethod()
,子类没法重写(override), 但能够有同名方法。函数
public interface A {
// 不能被子类继承或重写
private void privateMethod(){
//do something
}
}
复制代码
public interface A {
// 不能被子类继承或重写
private static void privateStaticMethod(){
//do something
}
}
复制代码
这两种私有方法实际上是对JDK8 默认方法和静态方法 的补充,这样能够避免代码的冗余。spa
抽象类是对一组类的共同特征进行抽象 ,是子类的模板(is-a)设计
接口是对行为的抽象,是一种行为的规范和约束 (like-a)code
关注微信公众号 「码上实战」 回复 :面试视频 和 架构师 送你很是不错的资料!