原文:抽象類和接口的區別已經變了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
關注微信公衆號 「碼上實戰」 回覆 :面試視頻 和 架構師 送你很是不錯的資料!