6

我有以下课程:

class foo {
    public void a() {
        print("a");
    }
    public void b() {
        a();
    }
}

class bar extends foo {
    public void a() {
        print("overwritten a");
    }
}

当我现在调用 bar.b() 时,我希望它调用 foo 中的重写方法 a()。但是,它确实打印“a”。

4

7 回答 7

10

您的两个课程是否在不同的包中?您的 foo 类方法是公开的、受保护的、私有的还是包本地的?显然,如果他们是私人的,这将行不通。也许不太明显的是,如果它们是本地包(即没有公共/受保护/私有范围),那么您只能在与原始类在同一个包中时覆盖它们。

例如:

包装原件;
公共类 Foo {
  void a() { System.out.println("A"); }
  公共无效 b() { a(); }
}

包装另一个;
公共类酒吧扩展 original.Foo {
  void a() { System.out.println("覆盖的 A"); }
}

包装另一个;
公共类程序{
  公共静态无效主要(字符串[]参数){
    酒吧酒吧 = 新酒吧();
    bar.b();
  }
}

在这种情况下,您仍然会得到“A”。如果你在 Foo 中声明原始的 a() 方法为 public 或 protected,你会得到你期望的结果。

于 2009-04-10T04:05:32.787 回答
9

可能是您正在尝试使用静态方法,因为它们不会被覆盖,因此无法正常工作。

一个很好的检查方法是将 @Override 注释添加到 bar.a() 并查看编译器是否给你一个错误 a() 实际上并没有覆盖任何东西

于 2009-04-10T03:16:55.867 回答
7

当我运行以下命令时:

public class Program {
    public static void main(String[] args) {
        bar b = new bar();
        b.b();
    }
}

class foo {
    public void a() {
       System.out.printf("a");
    }
    public void b() {
        a();
    }
}

class bar extends foo {
    public void a() {
        System.out.printf("overwritten a");
    }
}

我得到以下输出:

overwritten a

这是我希望看到的。

于 2009-04-10T03:03:17.600 回答
1

方法是否定义为静态的?这是我能看到得到这个结果的唯一方法。我在这里找到了一个很好的解释:http: //faq.javaranch.com/view?OverridingVsHiding

于 2009-04-10T03:16:50.080 回答
0

如果您来自 C# 或其他必须显式声明虚函数和/或覆盖函数的语言,您可能会感到困惑。

在 Java 中,所有实例函数都是虚拟的,并且可以被覆盖——除非它们被声明为私有和/或最终的。

不需要指定新的 @Override 注释来这样做,添加注释只是指定您的意图是覆盖,如果不是覆盖,将导致警告或错误。(例如,如果您不小心拼错了方法名称)。

Andrew 的示例显示了这应该如何工作。

于 2009-04-10T03:53:31.723 回答
0

从马口中:

http://download.oracle.com/javase/tutorial/java/IandI/override.html

“被调用的覆盖方法的版本是子类中的版本。被调用的隐藏方法的版本取决于它是从超类调用还是从子类调用。”

因此,如果它们都是静态方法,并且您从超类调用该方法,则调用的是超类方法,而不是子类方法。所以真的,没有发生压倒一切。

于 2011-07-15T04:31:00.347 回答
-1

当我在开发一个 Android 程序时,我的 Java 类也遇到了同样的问题。事实证明,问题不在于类,而在于 Android 框架处理屏幕输出的方式。

例如,如果输出是在父类的 onCreate() 方法中编程的,Android 无法从第一个子类之外的子类中正确获取被覆盖方法的输出。老实说,我不了解整个方法调用顺序。

为了解决这个问题,我只是在 onResume() 中对输出进行了编程,现在它似乎工作正常。

于 2012-10-31T15:00:14.667 回答