Java @构造函数不支持重写
我知道构造函数在java中是不可继承的,我们需要使用super()-super必须是构造函数中的第一条语句 但是为什么我不能使用Java @构造函数不支持重写,java,Java,我知道构造函数在java中是不可继承的,我们需要使用super()-super必须是构造函数中的第一条语句 但是为什么我不能使用@Override注释 例如: public class Foo extends Point2D.Double { @Override // The annotation @Override is disallowed for this location public Foo(){} } 如果我有一个Foo实例,我永远不能直接调用Point2D.Dou
@Override
注释
例如:
public class Foo extends Point2D.Double {
@Override // The annotation @Override is disallowed for this location
public Foo(){}
}
如果我有一个Foo实例,我永远不能直接调用
Point2D.Double.Double()!这个行为完全像是覆盖 @Override
在重写方法(不是构造函数!)时使用,这意味着您正在使用与超类中的一个方法相同的名称和参数创建一个方法
在您的超类中没有名为Foo()
的构造函数(显然),因为构造函数不是从父类继承的,所以这不是重写
重写只能应用于非构造函数且未定义为final的继承方法。因为以前没有将被重写的Foo的实现。@Override
表示重写子类中的superclass(父类)方法的位置。构造函数不是方法,不能以这种方式重写。所以你不能把@Override
放在那里。你不能重写构造函数
构造函数不是继承的
您的子类构造函数与超级类的构造函数完全不同且独立(在语义上,由于初始化等原因,它可能依赖于语言)
虽然您可以调用super()
来调用超类的构造函数,但它被称为链接而不是重写。编译器在编译java类时检查重写规则。无法重写构造函数,因此如果有人试图对构造函数使用@Override注释,编译器将生成错误。,因为您没有覆盖构造函数。如您所述,构造函数
是不可继承的。在子类中定义构造函数与覆盖方法的过程不同。因此,当您在子类中定义构造函数时,JVM
会自动调用super()
,或者您必须自己调用,这在覆盖方法时不是必需的 只有在父类中有方法时才能重写。因为父类没有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");
情况是您根本不执行覆盖。这就是为什么不能使用该注释。当您声明一个新的构造函数时,您可以确信super()
将被Java调用。你不必强迫它。此外,在super()
之前,您不能应用任何附加操作。这导致了这样一个结论:如果需要从父类调用默认构造函数,则不必做任何特殊的操作
当您强制使用某个参数化构造函数时,情况会发生变化,然后您必须在子类中添加该调用。但是如果您的父类没有默认构造函数,那么您将始终需要调用该参数化构造函数。Hm的可能重复项,不是重复项,但已经在那里得到了回答。Hm,我猜public Foo(int i){super();}
将无法使用@覆盖
,Oracle开发人员太粗野,无法检查参数是否匹配!调用super()
与直接调用Point2D.Double.Double()
相同。即使你不写super()代码>在构造函数中,它无论如何都被调用。调用super()
并不是重写,它只是使用另一个类的构造函数。Using不是重写。@Celebes我在Point2D.Double.Double()中做了一个断点,删除了super()
并调试Foo
的创建。不幸的是,我的断点没有调试!你确定我不需要调用super()代码>?super()
不是我要问的问题。您有一个完整的工作示例,没有super()代码>行。我想这就是造成你困惑的原因。否则为什么你会认为你可以重写一个构造函数呢?也许我应该删除super()代码>行。看见Foo只有一个默认构造函数,对吗?对我来说,它看起来像是在重写。你是说在你看来,Foo()正在重写超类构造函数?但是,即使超类构造函数的名称是不同的,我很抱歉我没有遵循。但我希望我的回答有帮助。