我们可以在同一个类的子类中覆盖超类的构造函数。 如果有,怎么样? 如果不是,为什么?
class Super{}
class Sub extends Super
{
//write code, if yes
}
答案 0 :(得分:4)
否,您无法覆盖 constructor
类的Super
。 JVM 肯定会在创建子类实例时调用超类构造函数。因此,每当创建 子类实例时,它将调用基类构造函数,然后使用 继续 >子类构造函数语句。 Constructors
不 Methods
可以覆盖
答案 1 :(得分:1)
我们可以在同一个类的子类中覆盖超类的构造函数吗?
没有。
使用继承,您只能获取/获取实例成员。构造函数不是类的成员。 Jvm专门用它来构造一个对象。您可以通过查看字节码指令来检查它。
通过ovveriding
,你实现了什么?构造函数必须构造当前对象。
答案 2 :(得分:0)
无法覆盖构造函数。构造函数的概念是创建一个类的实例,该行为只属于该类,不能被覆盖。
答案 3 :(得分: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构造函数 - 但是当您在String
中调用C
构造函数时,它实际上会转到int
中的A
构造函数。< / p>
答案 4 :(得分:0)
构造对象时,在特定于该对象的构造函数之前调用任何父构造函数。你无法改变这种行为。
然而, 可能,有一些技巧,创建一个对象而不调用任何构造函数。当然,在此之后,您可以执行所需的任何初始化。
您可以使用objenesis为您创建对象。这是相当低级的东西;在字节码级操作。
请注意,您无法使用反射执行此操作。
答案 5 :(得分:0)
overiding使用参数类型定义相同的名称,构造函数重写定义父类中的相同命名构造函数以及定义相同命名的父类和子类的子类,这是不可能的。所以我们不能做构造函数重写因此我们可以做构造函数重载。