what's the difference between abstract class and interface in java?

 java語言的抽象類別與介面的差異

  • 抽象類別、類別與介面比較
  • 多型、動態連結、過載與重寫
  • Java與C#的override 差異
  • 傳值呼叫、傳址呼叫與傳參考呼叫的比較
  • 相關考題

抽象類別、類別與介面比較

1. 繼承:
   - 抽象類別:
   - 類別:一個類別只能繼承一個父類別(單一繼承)。
   - 介面:一個類別可以實現多個介面(多重實現),並且不同的介面可以包含相同的方法簽名。

2. 實現:
   - 抽象類別:需覆寫(實現)父類別的所有抽象方法。在Java語言可省略@override這行(加在覆寫函式前一行)
   - 類別:可以選擇性地覆寫(實現)父類別的方法。
   - 介面:必須實現介面中定義的所有方法,否則該類別必須聲明為抽象(abstract)。

3. 建構子:
   - 抽象類別:
   - 類別:可以有建構子來初始化物件。
   - 介面:不能擁有實體建構子,因為介面不能直接實例化。

4. 儲存狀態:
   - 抽象類別:
   - 類別:可以有實體變數(屬性;物件的變數)來儲存物件的狀態。
   - 介面:不能有實體變數,僅包含方法簽名,但可以定義常數。

5. 單一繼承:
   - 抽象類別:
   - 類別:只可以繼承一個父類別。
   - 介面:一個介面可以擁有多個父介面。

6. 存取修飾子:
   - 抽象類別:
   - 類別:可有。
   - 介面:所有方法都是公開不用寫public 存取修飾子。

7. 適用:
   - 抽象類別:
   - 類別:共同基礎行為,共用程式碼。
   - 介面:共同規範。

多型與過載

  • 多型(polymorphism)
    • 多型是指允許不同物件以相同介面互動,實際執行方法可能不同。
    • 它允許你使用通用的方式處理不同類型的物件,而不需要關心實際的類型。
    • 多型的核心概念是子類別可以覆寫(override)父類別的方法,以提供特定的實現。
    • 多型出現在運行時,會根據物件實際型別呼叫正確方法。
  • 動態連結(Dynamic Binding)或叫動態分派(Dynamic Dispatching):
    • 動態連結是指在執行時期,程式碼會根據實際物件的類型來決定要呼叫的方法。
    • 這允許使用父類別的引用來引用子類別的物件,並且在執行時期根據實際物件的類型來選擇正確的方法。在 Java 中,動態連結是默認行為。
  • 過載(overload)允許同一類別定義多個相同名稱但不同參數之方法,以處裡不同情況。
  • 重寫(override)子類別重寫父類別方法。當子類別覆寫父類別的方法時,子類別可以改變方法的實現方式,但方法名稱、參數列表和返回值類型必須與父類別相同。

Java override與C# override的異同

- 相異:寫法不同
  + Java 的重寫方法,前一行要加@override
  + C# 的重寫方法,父類別加virtual 關鍵字如public virtual void method (),子類別加override 關鍵字如public override void method ()。
- 相同:用於在子類別中重寫父類別的虛擬方法。
- 範例:
//java abstract class override example
abstract class Animal {
// 抽象方法
public abstract void makeSound();
}
class Dog extends Animal {
@Override
public void makeSound() {
System.out.println("Woof!");
}
}
// Java interface override example
interface Animal {
void makeSound();
}
class Dog implements Animal {
private string sound;
public Dog(string sound) {
this.sound = sound;
}
@Override
public string makeSound() {
return sound;
}
}
//C# override example
class Animal {
public virtual void makeSound();
}
class Dog:Animal {
private string sound;
public Dog(string sound) {
this.sound = sound;
}
public override string makeSound() {
return sound;
}
}

範例


abstract class Animal {
// 抽象方法
public abstract void makeSound();
// 具體方法
public void sleep() {
System.out.println("Zzz...");
}
}
// 子類別
class Dog extends Animal {
@Override
public void makeSound() {
System.out.println("Woof!");
}
}
class Cat extends Animal {
@Override
public void makeSound() {
System.out.println("Meo");
}
}
//使用多型
public class Main{
public static void main(string[] args){
Animal dog=new Dog();
Animal cat=new Cat();
dog.makeSound();
cat.makeSound();
}
}
// 介面
interface Animal {
void makeSound();
void sleep();
}
// 實作介面的類別
class Dog implements Animal {
private string sound;
private string sleep;
public Dog(string sound) {
this.sound = sound;
}
@Override
public string makeSound() {
return sound;
}
public int addDog(int a, int b) {
return a+b;
}
public int addDog(int a, int b,int c) {
return a+b+c;
}
@Override
public string sleep() {
return sleep;
}
}
//使用過載
public class Main{
public static void main(string[] args){
Animal dog=new Dog("woof");
System.out.println("sound:"+dog.addDog(1,2));
System.out.println("new sound:"+dog.addDog(1,2,3));
}
}

相關考題

考題一、請解釋 Java 語言中,類別與介面(interface)有那些不同,並請舉例加以說明。

答案

(一)參考上述抽象類別、類別與介面比較
(二)

//abstract class example
abstract class Animal {
protect string sound="";//可用存取修飾子屬性成員
public Animal (string sound){
sound=sound;
}
public abstract void makeSound (){};
}
class Cat extends Animal {//類別只能繼承一個抽象類別
public Cat(string sound){
super (sound);
}
@override //實現抽象方法
public void makeSound (){
System.out.println(sound);
}
}
// class example
class Animal {
protect string sound="";//可用存取修飾子屬性成員
public Animal (string sound){
sound=sound;
}
public void makeSound (){
System.out.primtln(sound);
};
public void eat (){
System.out.primtln("eat some food");
};
}
class Cat extends Animal {//類別只能繼承一個類別
public Cat(string sound){
super (sound);
}
@override //可重寫任意個父類別方法
public void makeSound (){
System.out.println(sound);
}
}
// interface example
interface Animal {
void setName(string name){};
}
interface Action {
void makeSound (string sound){};
void eat (){};
}
class Cat implements Animal, Action {//類別可實現多個介面
@override //實現Action介面中定義的makeSound方法
public void makeSound (string sound){
System.out.println("sound is "+sound);
}
@override //實現Action介面中定義的eat方法
public void eat (){
System.out.println("eat some food");
}
@override //實現Animal介面中定義的setName方法
public void setName (string name){
System.out.println("name is "+name);
}
}

考題二、傳值呼叫、傳址呼叫與傳參考呼叫的比較


頁尾

Comments

Popular posts from this blog

Format date as yyyy-mm-dd using vbscript

How to write data into a excel file using vbscript