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抽像類別與介面有什麼不同?
沒有留言:
張貼留言