虚拟功能
虚方法是 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”。
使用的来源和进一步的读数:
看看这个很棒的答案,它提供了有关虚拟功能的更完整信息: