Java面試—JDK1.8介面和抽象類
阿新 • • 發佈:2019-02-03
前言
介面是對動作的抽象,抽象類是對根源抽象。
使用抽象類,也就是繼承,是一種強耦合的設計,用來描述“A is a B” 的關係,即如果說A繼承於B,那麼在流程中將A當做B去使用應該完全沒有問題。
介面設計目的就是對類的行為進行約束,,也就是提供一種機制,可以強制要求不同的類具有相同的行為。它只約束了行為的有無,但不對如何實現行為進行限制。對“介面為何是約束”的理解,我覺得配合泛型食用效果更佳。
抽象類:
- 被Abstract關鍵字修飾的類是抽象類;
- 含有抽象方法的類一定是抽象類,但是抽象類不一定含有抽象方法;且抽象方法必須是public或protected,否則不能被子類繼承。預設為public。
- 抽象方法中不能有實現,否則編譯報錯;
- 抽象類中可以定義自己的成員變數和成員方法,許可權沒要求,private,protected,public。
- 抽象方法要被實現,不能是static,也不能是private。
- 子類繼承抽象類時,必須實現抽象類中的所有抽象方法,否則該子類也要被定義為抽象類;
- 抽象類不能被例項化,例項化的話,就是多型了。
- 可以有main方法,不可以new一個抽象類
- 可以有構造器,初始化塊,內部類
- abstract不能修飾成員,區域性變數,更不能修飾構造器
public abstract class Test { private int a; protected int b; public int c; int d; abstract int geta(); //不能有方法體,不能用private protected abstract int getb(); static void fun1(){ System.out.println("靜態方法"); } private void fun(){ System.out.println("私有普通方法"); } static{ System.out.println("靜態程式碼塊"); } { System.out.println("程式碼塊"); } public Test(){ System.out.println("建構函式"); } }
介面:
- 介面中變數型別預設且只能是public staic final
- 介面中宣告抽象方法(普通方法),且只能是預設的public abstract,沒有具體的實現;
- 預設的方法沒有方法體,但JDK1.8之後預設方法,靜態方法是要有方法體的。
- 可以有main方法,可以new一個介面,需要在方法體中實現所有介面函式
- 子類必須實現所有介面函式;
- 不能定義構造器和初始化塊
public interface Test { int a =1; //常量 void fun(); //抽象方法 default void fun1(){ System.out.println("預設方法"); } static void fun2(){ System.out.println("靜態方法"); } }
區別:
- 一個類只能繼承一個抽象類,但可以實現多個繼承
- 抽象類中可以包含靜態程式碼塊和靜態方法,介面則不能。
- 介面方法都是抽象的,抽象類可以同時包含抽象和非抽象的。
- 實現介面必須要實現所有方法,而抽象類可以不用全部實現抽象方法,但是其子類也得是抽象類
- 兩者都不能直接例項化,要例項化的話就涉及到多型了。