我们能否在同一类的子类中覆盖超类的构造函数? 如果可以,如何实现? 如果不行,为什么?
class Super{}
class Sub extends Super
{
//write code, if yes
}
我们能否在同一类的子类中覆盖超类的构造函数? 如果可以,如何实现? 如果不行,为什么?
class Super{}
class Sub extends Super
{
//write code, if yes
}
Super
类的构造函数。创建子类实例时,JVM会调用超类构造函数。所以,每次你创建一个子类实例时,它都会先调用基类构造函数,然后继续执行子类构造函数语句。构造函数
不是可以覆盖的方法
。我们能在同一类的子类中覆盖超类的构造函数吗?
不行。
通过继承,你只能获取实例成员。构造函数不是类的成员。JVM会特殊处理它来构造一个对象。你可以通过查看字节码指令来验证这一点。
通过“覆盖”,你能实现什么?构造函数必须构造当前对象。
你可以在某种程度上覆盖构造函数。实际上你不能真正地覆盖一个构造函数,但你可以达到一些相同的结果。
当你在子类中指定一个构造函数时,你可以按照自己的喜好来构建它。这个构造函数可以选择调用哪个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
构造函数。
构造函数不能被覆盖。构造函数的概念是创建一个类的实例,这种行为只属于该类,不能被覆盖。
当你构造一个对象时,任何父级构造函数都会在特定于该对象的构造函数之前调用。您无法更改此行为。
但是,通过一些诡计,可以创建一个对象而不调用任何构造函数。之后,当然,您可以执行任何需要的初始化。
您可以使用 objenesis为您创建对象。这是相当低级的东西;在字节码级别操作。
请注意,您无法使用反射来实现此操作。
覆盖定义与参数类型相同的定义,构造函数覆盖在父类和子类中定义了同名的构造函数,这定义了同名的父类和子类,这是不可能的...因此我们不能进行构造函数覆盖,因此我们可以进行构造函数重载。