1. 程式人生 > >Java面試—JDK1.8介面和抽象類

Java面試—JDK1.8介面和抽象類

前言

介面是對動作的抽象,抽象類是對根源抽象。

        使用抽象類,也就是繼承,是一種強耦合的設計,用來描述“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("靜態方法");
    }
}

區別:

  • 一個類只能繼承一個抽象類,但可以實現多個繼承
  • 抽象類中可以包含靜態程式碼塊和靜態方法,介面則不能。
  • 介面方法都是抽象的,抽象類可以同時包含抽象和非抽象的。
  • 實現介面必須要實現所有方法,而抽象類可以不用全部實現抽象方法,但是其子類也得是抽象類
  • 兩者都不能直接例項化,要例項化的話就涉及到多型了。