java中的抽象/虚拟函数

java中的抽象/虚拟函数,java,virtual,abstract,Java,Virtual,Abstract,我听说所有Java函数都是隐式虚拟的,但我仍然不确定它是否能按我所希望的方式运行 假设我有一个a班,孩子是B。 A和B都有名为foo()的函数,因此B的定义覆盖了A的定义 还假设A有一个名为的函数,该函数将A的实例作为参数: 如果我将B的实例传递给函数,它将调用foo()的哪个定义,将调用A还是B?B的实现。 这正是虚拟的意思。B的实现将被调用。 这正是virtual的意思。正如我在评论中提到的,私有函数不是虚拟的,我想用以下示例来演示它: class A { public void f

我听说所有Java函数都是隐式虚拟的,但我仍然不确定它是否能按我所希望的方式运行

假设我有一个a班,孩子是B。 A和B都有名为foo()的函数,因此B的定义覆盖了A的定义

还假设A有一个名为的函数,该函数将A的实例作为参数:


如果我将B的实例传递给函数,它将调用foo()的哪个定义,将调用A还是B?

B的实现。

这正是虚拟的意思。

B的实现将被调用。

这正是
virtual
的意思。

正如我在评论中提到的,私有函数不是虚拟的,我想用以下示例来演示它:

class A {
    public void foo() {
        System.out.println("A#foo()");
    }

    public void bar() {
        System.out.println("A#bar()");
        qux();
    }

    private void qux() {
        System.out.println("A#qux()");
    }
}

class B extends A {
    public void foo() {
        System.out.println("B#foo()");
    }

    private void qux() {
        System.out.println("B#qux()");
    }
}
现在让我们运行以下代码:

A foobar = new B();
foobar.foo(); // outputs B#foo() because foobar is instance of B
foobar.bar(); // outputs A#bar() and A#qux() because B does not have method bar 
              // and qux is not virtual

正如我在评论中提到的,私有函数不是虚拟的,我想用以下示例演示它:

class A {
    public void foo() {
        System.out.println("A#foo()");
    }

    public void bar() {
        System.out.println("A#bar()");
        qux();
    }

    private void qux() {
        System.out.println("A#qux()");
    }
}

class B extends A {
    public void foo() {
        System.out.println("B#foo()");
    }

    private void qux() {
        System.out.println("B#qux()");
    }
}
现在让我们运行以下代码:

A foobar = new B();
foobar.foo(); // outputs B#foo() because foobar is instance of B
foobar.bar(); // outputs A#bar() and A#qux() because B does not have method bar 
              // and qux is not virtual

我认为私有函数不是虚拟的,您可以有两个
private foo()
方法,每个类都将调用它的own@hoaz它们确实是虚拟的,但不能被覆盖。顺便说一下,在子类中,您不重写
private
方法,而只是将其隐藏。这就是所谓的隐藏。更多信息:你不觉得自己自相矛盾吗?:)如果它是虚拟的,那么它有什么虚拟属性?也就是说,私有方法是最终的,因此是非私有的-virtual@OldCurmudgeon任何其他访问级别都不是,答案取决于访问级别。我认为私有函数不是虚拟的,可以有两个
private foo()
方法,每个类将调用own@hoaz它们确实是虚拟的,但不能被覆盖。顺便说一下,在子类中,您不重写
private
方法,而只是将其隐藏。这就是所谓的隐藏。更多信息:你不觉得自己自相矛盾吗?:)如果它是虚拟的,那么它有什么虚拟属性?也就是说,私有方法是最终的,因此是非私有的-virtual@OldCurmudgeon也不是任何其他访问级别,答案取决于访问级别。私有方法仅限于类的范围。因此,对于包public,everyone,类的私有成员没有外部可访问性,即使对于继承的类也是如此,因此,它是虚拟的没有任何用途,因为它不能被除包含类以外的任何对象访问。私有方法仅限于类的范围。因此,对于包public,everybody,类的私有成员没有外部可访问性,即使对于继承的类也是如此,它是虚拟的没有任何用途,因为除了它包含的类之外,它不能被任何其他对象访问。虚拟意味着它可以被继承或重写。虚拟意味着它可以被继承或重写。