虛擬功能
虛方法是 Java 中非靜態且前面沒有關鍵字 Final 的方法。預設情況下,所有方法都是 Java 虛擬的。虛方法在多型中起著重要作用,因為如果被覆蓋的函式是非靜態的且具有相同的方法簽名,則 Java 中的子類可以覆蓋其父類的方法。
但是,有些方法不是虛擬的。例如,如果方法宣告為 private 或關鍵字為 final,則該方法不是 Virtual。
請考慮以下使用此 StackOverflow 帖子中的虛擬方法繼承的修改示例虛擬函式如何在 C#和 Java 中工作? :
public class A{
public void hello(){
System.out.println("Hello");
}
public void boo(){
System.out.println("Say boo");
}
}
public class B extends A{
public void hello(){
System.out.println("No");
}
public void boo(){
System.out.println("Say haha");
}
}
如果我們呼叫類 B 並呼叫 hello()
和 boo(),我們會得到 No
和“Say haha”作為結果輸出,因為 B 會覆蓋 A 中的相同方法。儘管上面的例子幾乎完全相同方法重寫,重要的是要理解 A 類中的方法預設都是 Virtual。
此外,我們可以使用 abstract 關鍵字實現 Virtual 方法。使用關鍵字 abstract
宣告的方法沒有方法定義,這意味著方法的主體尚未實現。再考慮上面的例子,除了 boo()
方法被宣告為 abstract:
public class A{
public void hello(){
System.out.println("Hello");
}
abstract void boo();
}
public class B extends A{
public void hello(){
System.out.println("No");
}
public void boo(){
System.out.println("Say haha");
}
}
如果我們從 B 呼叫 boo()
,輸出仍然是“Say haha”,因為 B 繼承了抽象方法 boo()
並使 boo()
輸出“Say haha”。
使用的來源和進一步的讀數:
看看這個很棒的答案,它提供了有關虛擬功能的更完整資訊: