【问题标题】:Abstract/Virtual Functions in javajava中的抽象/虚函数
【发布时间】:2013-05-13 02:36:32
【问题描述】:

我听说所有 Java 函数都是隐式虚拟的,但我仍然不确定这是否会按照我的意愿运行。

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

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

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

【问题讨论】:

  • 我认为私有函数不是虚拟的,你可以有两个private foo() 方法,每个类都会调用自己的
  • @hoaz 它们确实是虚拟的,但不能被覆盖。顺便说一句,在子类中,您不会重写 private 方法,而只需 隐藏 它。这被称为隐藏。更多信息:docs.oracle.com/javase/tutorial/java/IandI/override.html
  • 你不觉得你自相矛盾吗? :) 如果是虚拟的,它有什么虚拟属性?
  • 说同样的话,私有方法是最终的,因此是非虚拟的
  • @OldCurmudgeon 也不是任何其他访问级别——答案取决于访问级别。

标签: java virtual abstract


【解决方案1】:

B 的实现将被调用。
这正是virtual 的意思。

【讨论】:

  • 虚拟意味着它可以被继承或覆盖。
【解决方案2】:

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

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

【讨论】:

  • 私有方法仅限于类的范围。受保护的,对于公共包,每个人因此,一个类的私有成员没有外部可访问性,即使对于继承的类,因此,它是虚拟的没有任何用途,因为它不能被包含类以外的任何东西访问。
猜你喜欢
  • 2016-11-29
  • 2020-07-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-08
  • 2023-03-14
  • 2013-01-15
  • 2011-03-21
  • 1970-01-01
相关资源
最近更新 更多