繁体   English   中英

超类不会调用重写方法吗?

[英]Does the super class not call the overridden method?

我有以下课程:

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”。

你的两个班级是不同的包吗? 你的foo类方法是公共的,受保护的,私有的还是包本地的? 显然,如果它们是私有的,这将不起作用。 也许不那么明显,如果它们是本地包(即没有公共/受保护/私有范围),那么只有在与原始类位于同一包中时才能覆盖它们。

例如:

package original;
public class Foo {
  void a() { System.out.println("A"); }
  public void b() { a(); }
}

package another;
public class Bar extends original.Foo {
  void a() { System.out.println("Overwritten A"); }
}

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

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

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

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

当我运行以下内容时:

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

这是我期望看到的。

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

从马的嘴里:

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

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

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

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

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

没有必要指定新的@Override注释来执行此操作,添加注释只是指定您的意图将被覆盖,并且如果它不是覆盖,将导致警告或错误。 (例如,如果您不小心拼错了方法名称)。

安德鲁的例子说明了这应该如何运作。

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

例如,如果输出是在父类的onCreate()方法中编程的,则Android无法从第一个子节点之外的子类中正确获取重写方法的输出。 老实说,我不懂整个方法的调用顺序。

为了解决这个问题,我只是简单地在onResume()中编写输出,现在它似乎工作正常。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM