你能用Java编写虚拟函数吗?
是。 事实上,Java中的所有实例方法都是默认情况下是虚拟的。 只有某些方法不是虚拟的:
类的方法(因为通常每个实例保存的信息像指向一个vtable关于其具体方法,但没有实例在这里可用)。
私有实例方法(因为没有其他类可以访问该方法,因此调用实例始终具有定义类本身的types,因此在编译时明确知道)。
这里有些例子:
“正常”的虚拟function
以下示例来自另一个答案中提到的维基百科页面的旧版本 。
import java.util.*; public class Animal { public void eat() { System.out.println("I eat like a generic Animal."); } public static void main(String[] args) { List animals = new LinkedList(); animals.add(new Animal()); animals.add(new Fish()); animals.add(new Goldfish()); animals.add(new OtherAnimal()); for (Animal currentAnimal : animals) { currentAnimal.eat(); } } } class Fish extends Animal { @Override public void eat() { System.out.println("I eat like a fish!"); } } class Goldfish extends Fish { @Override public void eat() { System.out.println("I eat like a goldfish!"); } } class OtherAnimal extends Animal {}
输出:
我像一个普通的动物吃。
我像鱼一样吃!
我喜欢吃金鱼!
我像一个普通的动物吃。
与接口的例子
Java 接口方法都是虚拟的。 它们必须是虚拟的,因为它们依赖于实现类来提供方法实现。 要执行的代码只能在运行时select。
例如:
interface Bicycle { //the function applyBrakes() is virtual because void applyBrakes(); //functions in interfaces are designed to be } //overridden. class ACMEBicycle implements Bicycle { public void applyBrakes(){ //Here we implement applyBrakes() System.out.println("Brakes applied"); //function } }
具有抽象类的虚函数示例
与接口类似, 抽象类 必须包含虚拟方法,因为它们依赖于扩展类的实现。 例如:
abstract class Dog { final void bark() { //bark() is not virtual because it is System.out.println("woof"); //final and if you tried to override it } //you would get a compile time error. abstract void jump(); //jump() is a "pure" virtual function } class MyDog extends Dog{ void jump(){ System.out.println("boing"); //here jump() is being overridden } } public class Runner { public static void main(String[] args) { Dog dog = new MyDog(); // Create a MyDog and assign to plain Dog variable dog.jump(); // calling the virtual function. // MyDog.jump() will be executed // although the variable is just a plain Dog. } }