当前位置: 首页 > 知识库问答 >
问题:

为什么必须在任何子类方法的代码之前调用方法的超类版本?

鄢选
2023-03-14

我这样问是出于好奇,而不是出于需要。我想答案是“因为Java就是这样构建的”。我想知道为什么会选择这条路。

例如,如果我的超类有这个方法:

public void foo()
{
   System.out.println("We're in the superclass.");
}

子类覆盖了方法:

@Override
public void foo()
{
   super.foo();
   System.out.println("We're in the subclass.");
}

为什么超级需要它。foo()是否位于子类方法的顶部(如果要使用它)?为什么我不能交换这两行使其看起来像这样:

@Override
public void foo()
{
   System.out.println("We're in the subclass.");
   super.foo();
}

共有1个答案

谢泉
2023-03-14

它不是。它适用于构造函数,但对于普通方法,您可以随时调用它。如果您不想调用它,您甚至不必调用它,或者您可以完全调用不同的父类方法。

根据您的示例:

public static void main(String[] args) {
    new B().foo();
}

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

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

输出

In B
In A
 类似资料:
  • 这是我的密码 结果为上述结果之一。从调用仍然调用子类的,即使从词汇上讲,meth调用在超类内部!那么,当是私有的时候,为什么会有不同的行为呢? ___________edit____________ 代码是这样的吗 O/P将是 因此,即使超级类中的正在调用,但实际上子类的正在被调用。所以,方法调用不是词法意义上的!也就是说,即使看起来将调用超级类的meth,实际上它的子类的becoz子类实例首先调

  • 我正在学习java入门课程,我们刚刚开始学习继承。我正在做一项任务,要求我们创建一个具有名称和年龄的“Pet”超类;和三个子类,每个都有自己独特的特征(我选择了“狗”、“猫”和“鸟”)。在我们构建了所有这些之后,我们将创建一个主类来测试一切,这就是我遇到问题的地方。我试图为这些独特的特性调用

  • 问题内容: 以下代码在该行生成此错误消息。 这行有多个标记 -实现android.view.View.OnClickListener.onClick -new View.OnClickListener(){}类型的onClick(View)方法必须覆盖超类方法 我不明白为什么。这段代码摘自我所见过的众多示例。什么可能是错的? 问题答案: 检查项目的属性,并验证 Java Compiler- > C

  • 问题内容: 是否有一种标准方法可以在Swift中制作“纯虚函数”,即。一个 必须 由每个子类中被覆盖,并且,如果不是的话,将导致编译时错误? 问题答案: 您有两种选择: 将超类定义为协议而不是类 Pro :编译时检查每个“子类”(不是实际的子类)是否实现了所需的方法 缺点 :“超类”(协议)无法实现方法或属性 2.声明该方法的超级版本 例: Pro :可以在超类中实现方法和属性 缺点 :不检查编译

  • 下面是一个示例项目:http://cl.ly/3N2u2i1S441M 我在一个UITableViewCell超类中,因为当子类被初始化时,我调用super。init()。在子类和超类的init的底部,我调用了一个方法,调用styleCell,对其应用样式。该方法来自于它们都符合的协议,其中一个隐式符合,因为它是子类,并且覆盖了该方法。 在超类'的末尾,调用该样式方法,但它调用子类'方法,而不是它

  • 问题内容: 让我们看一下这段代码: 我希望这能打印出“孩子”,但结果是“父母”。为什么Java会改为调用父类,我该怎么做才能使其在子类中调用方法? 问题答案: 不会覆盖,因为它没有相同的形式参数。一个拿走,另一个拿走。因此,运行时的多态不会被应用,并且不会导致子类方法的执行。根据Java语言规范: 如果满足以下所有条件,则在类C中声明或由类C继承的实例方法从类C中 重写 另一个在类A中声明的方法: