你能用 Java 编写虚函数/方法吗?

有可能像在 C + + 中那样用 Java 编写 虚拟的方法吗?

或者,是否有适当的 Java 方法可以实现,从而产生类似的行为?我能举几个例子吗?

246720 次浏览

默认情况下,Java 中的所有函数都是虚函数。

您必须特意添加“ final”关键字来编写非虚函数。

这与 C + +/C # 缺省值相反。默认情况下,类函数是非虚函数; 您可以通过添加“虚拟”修饰符使它们成为非虚函数。

来自 维基百科

爪哇咖啡中,所有非静态方法都是通过 默认“ 虚拟函数。”只 标记为 最终关键词的方法, 不能被覆盖 私有方法 ,它们不是 遗传,是 非虚拟的

在 Java 中,所有 非隐私实例方法默认情况下都是虚方法。

在 C + + 中,私有方法可以是虚方法。这可以用于非虚拟接口(NVI)习惯用法。在 Java 中,需要使 NVI 可重写的方法受到保护。

来自 Java 语言规范 v3:

8.4.8.1重写(通过实例方法)实例方法 m1 在类 C 中声明的 声明的另一个实例方法 m2 在 A 类中如下所有 是真的:

  1. C 是 A 的一个子类。
  2. M1的签名是签名的子签名(8.4.2) 平方米。
  3. 都行 * m2是公共的、受保护的或声明的,在 与 C 相同的包装,或 * m1重写方法 m3,m3不同于 m1,m3不同于 M2,使得 m3凌驾于 m2之上。

是的,您可以用 Java 编写虚“函数”。

你能用 Java 编写虚函数吗?

是的。事实上,Java 中的所有实例方法默认都是虚拟的。只有某些方法不是虚拟的:

  • 类方法(因为通常每个实例都包含有关其特定方法的信息,比如指向 vtable 的指针,但是这里没有实例可用)。
  • 私有实例方法(因为没有其他类可以访问该方法,所以调用实例始终具有定义类本身的类型,因此在编译时是明确知道的)。

下面是一些例子:

“正常”虚拟函数

下面的例子来自另一个答案中提到的维基百科页面的 旧版本

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 {}

产出:

I eat like a generic Animal.
I eat like a fish!
I eat like a goldfish!
I eat like a generic Animal.

接口 的虚函数示例

Java接口方法都是虚拟的。它们 必须的是虚拟的,因为它们依赖于实现类来提供方法实现。要执行的代码只能在运行时选择。

例如:

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 中,所有的公共(非私有)变量和函数在默认情况下都是 虚拟的。 此外,使用关键字 期末考试的变量和函数不是 虚拟的