虛擬功能

虛方法是 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​​”。

使用的來源和進一步的讀數:

虛擬函式如何在 C#和 Java 中工作?

看看這個很棒的答案,它提供了有關虛擬功能的更完整資訊:

你能用 Java 編寫虛擬函式/方法嗎?