虚拟功能

虚方法是 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 编写虚函数/方法吗?