1. 程式人生 > >抽象類和介面的關係

抽象類和介面的關係

Java的基礎面試題還是很多會考這個的,所以自己總結下。(JDK8之後)

相同點:

1.抽象類和介面都不能被例項化

2.它們當中都能夠包含抽象方法

重點是它們的區別:

1、抽象類當中有抽象方法普通方法(有方法體),普通方法可以不被重寫;

介面當中的方法包含抽象方法預設(default)方法,同樣預設方法也可以不被重寫,呼叫時需要藉助介面的實現類的物件來進行呼叫,並且在JDK8.0之後,介面中也能有靜態方法(介面名.方法名呼叫)。

2、抽象類中有構造器和初始化塊,但是介面中沒有。

3、介面當中定義的是靜態常量,必須用public static final來進行定義,不能定義普通成員,而抽象類當中兩者都能進行定義。

抽象類的具體實現

public abstract class TestAbstractCLass {
    //抽象類可以有構造方法和初始化塊
    TestAbstractCLass() {

        System.out.println("抽象類的構造器");
    }
    //普通方法
    public void normalMethod() {
        System.out.println("這是一個抽象類的普通方法");
    }
    //普通靜態方法
    public static void normalStaticMethod() {
        System.out.println("這是一個抽象類的普通靜態方法");
    }

    //抽象方法,只能被public和protected修飾
    abstract void absMethodFromAbstractClass();
}

public class Sontest extends TestAbstractCLass{
  
    Sontest() {
        super();
    }

    @Override
    void absMethodFromAbstractClass() {

    }
    
//抽象類中的普通方法,可選擇是否重寫
//    @Override
//    public void normalMethod() {
//        super.normalAbs1();
//    }

public static void main(String[] args) {
       //呼叫抽象類的靜態普通方法,直接抽象類.靜態方法名即可呼叫
        TestAbstractCLass.normalStaticMethod();
        //呼叫抽象類中的普通方法(需要通過子類的物件來進行呼叫)
        new Sontest().normalMethod();
    }

介面的具體實現

public interface TestInterface {
    //預設方法
    default void defaultMethod() {
        System.out.println("介面中的預設方法");
    }

    //抽象方法(預設為public abstract修飾)
    void absMethodFromAbstractInterface();

    //JDK8後加入的靜態方法
    static void staticMethod() {
        System.out.println("介面中的靜態方法");
    }
}

public class Sontest implements TestInterface{

    //重寫介面中的抽象方法
    @Override
    public void absMethodFromAbstractInterface() {

    }
    
    //介面中的預設方法,可被重寫也可不被重寫
//    @Override
//    public void defaultMethod() {
//
//    }

public static void main(String[] args) {
   
        //呼叫介面中的預設方法
        new Sontest().defaultMethod();
        //靜態方法的呼叫
        TestInterface.staticMethod();
    }

}