你能用Java编写虚拟函数/方法吗?
是否有可能在Java中编写虚拟方法,就像在C ++中所做的一样?
或者,是否有适当的Java方法可以实现,产生类似的行为? 我能举一些例子吗?
从维基百科
在Java中 ,所有非静态方法都是默认的“ 虚拟函数”。只有标有关键字final的方法(不能被重写)以及没有被inheritance的私有方法 是非虚拟的 。
你能用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<Animal> animals = new LinkedList<Animal>(); 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. } }
Java中的所有函数默认都是虚拟的。
您必须通过添加“最终”关键字来开发非虚函数。
这与C ++ / C#默认相反。 类的function默认是非虚拟的; 你通过添加“虚拟”修饰符来制作它们。
所有非私有的实例方法在Java中默认都是虚拟的。
在C ++中,私有方法可以是虚拟的。 这可以用于非虚拟接口(NVI)习语。 在Java中,您需要保护NVI可覆盖的方法。
从Java语言规范v3:
8.4.8.1覆盖(通过实例方法)在类C中声明的实例方法m1覆盖在类A中声明的另一个实例方法m2,如果满足以下所有条件:
- C是A的一个子类
- m1的签名是m2的签名的子签名(第8.4.2节)。
- * m2是公共的,受保护的或者在与C相同的包中被默认访问声明的,或者* m1覆盖方法m3,m3不同于m1,m3不同于m2,因此m3覆盖m2。
是的,你可以用Java编写虚拟的“函数”。
在Java中,默认情况下,所有公共(非私有)variables和函数都是虚拟的。 而且,使用关键字final的variables和函数不是虚拟的 。