Java中的构造函数重载

3

我们能否在同一类的子类中覆盖超类的构造函数? 如果可以,如何实现? 如果不行,为什么?

class Super{}
class Sub extends Super
{
    //write code, if yes
}
6个回答

4
不可以覆盖Super类的构造函数。创建子类实例时,JVM会调用超类构造函数。所以,每次你创建一个子类实例时,它都会先调用基类构造函数,然后继续执行子类构造函数语句构造函数不是可以覆盖方法

1

我们能在同一类的子类中覆盖超类的构造函数吗?

不行。

通过继承,你只能获取实例成员。构造函数不是类的成员。JVM会特殊处理它来构造一个对象。你可以通过查看字节码指令来验证这一点。

通过“覆盖”,你能实现什么?构造函数必须构造当前对象。


0

你可以在某种程度上覆盖构造函数。实际上你不能真正地覆盖一个构造函数,但你可以达到一些相同的结果。

当你在子类中指定一个构造函数时,你可以按照自己的喜好来构建它。这个构造函数可以选择调用哪个super()构造函数。

所以你可以阻止一些子类构造函数,你可以修改它们的参数等。唯一的限制是至少要调用一个超级构造函数必须被调用。

A {  A(int i) {} A(String b) }

B extends A { B(int i) { super(i); doStuff() } }

C extends A { C(String b) { super(Integer.parseInt(b)) } }

我们有一个类 A,它有两个构造函数。

另一方面,类 B 没有 String 构造函数,在超级构造函数发生后执行额外的操作。

C 没有 int 构造函数 - 但是当您在 C 中调用 String 构造函数时,它实际上会转到 A 中的 int 构造函数。


这不是关于调用的问题,OP想要覆盖它。我可能错了,请再核对一下。 - Suresh Atta
构造函数只在构造类时调用。您无法完全替换超级构造函数的行为(因为必须调用其中一个)- 但是您可以通过限制可以调用哪些超级构造函数以及如何调用它们以及在调用它们时发生了什么来修改其行为。 - Tim B

0

构造函数不能被覆盖。构造函数的概念是创建一个类的实例,这种行为只属于该类,不能被覆盖。


0

当你构造一个对象时,任何父级构造函数都会在特定于该对象的构造函数之前调用。您无法更改此行为。

但是,通过一些诡计,可以创建一个对象而不调用任何构造函数。之后,当然,您可以执行任何需要的初始化。

您可以使用 objenesis为您创建对象。这是相当低级的东西;在字节码级别操作。

请注意,您无法使用反射来实现此操作。


0

覆盖定义与参数类型相同的定义,构造函数覆盖在父类和子类中定义了同名的构造函数,这定义了同名的父类和子类,这是不可能的...因此我们不能进行构造函数覆盖,因此我们可以进行构造函数重载。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接