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 ()。
- 相同:用於在子類別中重寫父類別的虛擬方法。
- 範例:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//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; | |
} | |
} |
範例
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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)有那些不同,並請舉例加以說明。
答案
(一)參考上述抽象類別、類別與介面比較
(二)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//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
Post a Comment