5

我知道构造函数在 java 中是不可继承的,我们需要使用 super() - super 必须是构造函数中的第一条语句。

但是为什么我不能使用@Override注释?

例如:

public class Foo extends Point2D.Double {
    @Override // The annotation @Override is disallowed for this location
    public Foo(){}
}

如果我有一个 Foo 的实例,我永远不能Point2D.Double.Double()直接调用!这种行为完全像 Overriding!

4

8 回答 8

7

@Override当您覆盖一个方法(不是构造函数!)时使用,这意味着您正在创建一个使用与超类中的方法之一相同的名称和参数的方法。

在您的超类中没有调用构造函数Foo()(显然),因为构造函数不是从父类继承的,所以这不是覆盖。

覆盖只能应用于不是构造函数且未定义为 final 的继承方法。

于 2013-09-11T09:34:53.443 回答
3

您不能覆盖构造函数。

构造函数不被继承。

您的子类构造函数完全不同并且独立于超类的构造函数(语言语义上,由于初始化等,它可能取决于。)。

虽然您可以调用super()超类的构造函数,但它称为链接而不是覆盖。

于 2013-09-11T09:39:02.710 回答
0

因为没有Foo的先前实现将被覆盖。

于 2013-09-11T09:35:46.873 回答
0

@Override表示子类中覆盖超类(父类)方法的地方。构造函数不是方法,不能以这种方式覆盖。所以你不能放在@Override那里。

于 2013-09-11T09:37:08.030 回答
0

编译器在编译 java 类时检查覆盖规则。构造函数不能被覆盖,因此如果有人尝试对构造函数使用 @Override 注释,编译器会生成错误。

于 2013-09-11T09:39:42.400 回答
0

因为您没有覆盖constructor. 正如您所说constructors,不可继承。在子类中定义构造函数与覆盖方法的过程不同。因此,当您在子类中定义构造函数时,会JVM自动调用super(),或者您必须自己进行调用,而在覆盖方法时不需要这样做。

于 2013-09-11T09:41:08.753 回答
0

只有在父类中有方法时才能覆盖。由于父类没有 Foo() 方法..因此不允许覆盖。

我相信您不是在询问是否要覆盖像这样的构造函数

public class Foo extends Point2D.Double {
    public Double(){
    }
}

这根本是不允许的。但是,每个子类构造函数都必须链接到子类中的另一个构造函数或超类中的构造函数。例如:

public class Superclass
{
    public Superclass(int x) {}

    public Superclass(String y) {}
}

public class Subclass extends Superclass
{
    public Subclass()
    {
        super(5); // chain to Superclass(int) constructor
    }
}

未继承构造函数的含义是您不能这样做:

// Invalid
Subclass x = new Subclass("hello");
于 2013-09-11T09:41:55.667 回答
0

情况是您根本不执行覆盖。这就是为什么您不能使用该注释的原因。当您声明一个新的构造函数时,您确信super()它将被 Java 调用。你不必强迫它。更何况你之前不能应用任何额外的操作super()。这导致的结论是,如果您需要从父类调用默认构造函数,您不必做任何特别的事情。

当您强制使用某些参数化构造函数时,情况会发生变化,那么您必须在子类中添加该调用。但是,如果您的父类没有默认构造函数,那么您将始终需要调用该参数化。

于 2013-09-11T09:43:13.090 回答