網頁

2020/4/25

Java 抽像類別(Abstract Class)與介面(Interface)的差異

Java 抽像類別(Abstract Class)與介面(Interface)的差異如下。

類別實作Interface使用關鍵字implements:類別繼承Abstract Class使用關鍵字extends

// 類別實作Interface
public class ConcreteClass implements InterfaceA { ... }
// 類別繼承Abstract Class
public class ConcreteClass extends AbstractClassC { ... }

Interface只能繼承(extends)Interface;Abstract Class能繼承類別也能實作Interface。

// Interface只能繼承Interface
public interface InterfaceA extends InterfaceB { ... }
// Abstract Class能繼承類別及實作Interface
public abstract class AbstractClassC extends AbstractClassD implements InterfaceC { ... }

類別能實作多個Interface,Interface能繼承多個Interface;類別只能繼承一個Abstract Class。

// Interface能實作多個Intetface
public interface InterfaceA extends InterfaceB, InterfaceC { ... }
// 類別能實作多個介面
public class ConcreteClass implements InterfaceA, InterfaceB { ... }
// 類別只能繼承一個Abstract Class
public class ConcreteClass extends AbstractClassC { ... }

Interface不可有實作方法(除了static method及Java 8的default method);Abstract Class可以有實作方法,也可以有無實作的抽象方法。

public interface InterfaceA {

    void doSomething(); // 方法無實作
    
    // 靜態方法有實作
    static String getSomething() {
        return "Something";
    }
    
    // Java 8 default methods
    default void doSomeStuff() { 
        System.out.println("do some stuff");
    }
    
}
public abstract class AbstractClassC {
    
    void doSomething() {
        System.out.println("do something"); // 方法有實作
    }

    abstract void doStuff(); // 無實作的抽象方法
    
}

Interface中的變數預設(也只能是)pulbic final static;Abstract Class可自訂變數的存取範圍。

public interface InterfaceA {

    int VALUE = 1; // implicit public static final 

}
public abstract class AbstractClassC {
    
    private int value; // 自訂存取範圍

}

Interface的方法預設(也只能是)public;Abstract Class則可自訂方法的存取範圍(但抽像方法不可為private)。

public interface InterfaceA {

    void doSomething(); // implicit public

}
public abstract class AbstractClassC {
    
    // 自訂存取範圍
    private void doSomething() { 
        System.out.println("do something");
    }

    abstract void doStuff(); // 無實作的抽象方法

}

面試考題,請問Java抽像類別與介面有什麼不同?


沒有留言:

張貼留言