我知道构造函数在java中不可继承,我们需要使用super() - super必须是Constructors中的第一个语句。
但为什么我不能使用@Override
注释?
例如:
public class Foo extends Point2D.Double {
@Override // The annotation @Override is disallowed for this location
public Foo(){}
}
如果我有一个Foo的实例,我永远不能直接拨打Point2D.Double.Double()
!这种行为完全像Overriding!
答案 0 :(得分:7)
@Override
,这意味着您正在使用与以下方法之一相同的名称和参数创建方法超类。
你的超类中没有构造函数Foo()
(显然),因为构造函数不是从父类继承的,所以这不是重写。
覆盖只能应用于非构造函数且未定义为final的继承方法。
答案 1 :(得分:3)
您无法覆盖构造函数。
构造函数不是继承的。
Yous子类构造函数完全不同于独立于超类的构造函数(语义语言,由于它可能依赖于初始化等。)。
虽然你可以调用super()
来调用超类的构造函数,但它被称为链接而不是覆盖。
答案 2 :(得分:0)
因为之前没有 Foo 的实现会被覆盖。
答案 3 :(得分:0)
@Override
表示子类中覆盖supper类(父类)方法的位置。 构造函数不是一种方法,不能以这种方式覆盖。所以你不能把@Override
放在那里。
答案 4 :(得分:0)
编译器在编译java类时检查覆盖规则。构造函数不能被覆盖因此,如果有人试图为构造函数使用@Override注释,编译器会生成错误。
答案 5 :(得分:0)
因为你没有挖掘constructor
。正如您所说constructors
不可继承。在子类中定义构造函数与ovverriding方法的过程不同。因此,当您在子类中定义构造函数时,JVM
会自动调用super()
,或者您必须自己调用,这在ovverriding方法时不是必需的。
答案 6 :(得分: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");
答案 7 :(得分:0)
案例是您根本不执行覆盖。这就是你不能使用那个注释的原因。声明新构造函数时,可以确保Java将调用super()
。你不必强迫它。您还不能在super()
之前应用任何其他操作。这导致了如果您需要从父类调用默认构造函数的结论,您不必执行任何特殊操作。
当您强制使用某些参数化构造函数时,大小写会发生变化,那么您必须在子类中添加该调用。但是如果您的父类没有默认构造函数,那么您将始终需要调用该参数化。