【发布时间】:2014-01-03 14:08:17
【问题描述】:
我们可以在同一个类的子类中重写超类的构造函数吗? 如果是,如何? 如果不是,为什么?
class Super{}
class Sub extends Super
{
//write code, if yes
}
【问题讨论】:
标签: java inheritance constructor overriding
我们可以在同一个类的子类中重写超类的构造函数吗? 如果是,如何? 如果不是,为什么?
class Super{}
class Sub extends Super
{
//write code, if yes
}
【问题讨论】:
标签: java inheritance constructor overriding
否,您不能覆盖Super 类的constructor。 JVM 在创建子类实例时肯定会调用超类构造函数。因此,每当您创建一个子类实例时,它都会调用基类构造函数,然后继续使用子类构造函数语句。 Constructors 不是 Methods 可以覆盖
【讨论】:
我们可以在同一个类的子类中重写超类的构造函数吗?
没有。
通过继承,您只能获取/获取实例成员。构造函数不是类的成员。 Jvm 特别对待它来构造一个对象。您可以通过查看字节码指令来检查。
ovveriding,你实现了什么?构造函数必须构造当前对象。
【讨论】:
构造函数不能被覆盖。构造函数的概念是创建一个类的实例,该行为只属于该类,不能被覆盖。
【讨论】:
您可以在某种程度上覆盖构造函数。您实际上无法覆盖其中一个,但您可以获得一些相同的结果。
当您在子类中指定构造函数时,您可以随意构建它。然后,该构造函数可以选择调用哪个 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 为您创建对象。这是相当低级的东西;在字节码级别操作。
请注意,您不能使用反射来做到这一点。
【讨论】:
覆盖定义了与参数类型相同的名称,构造函数覆盖在父类和子类中定义了相同的命名构造函数,它定义了相同的命名父类和子类,这是不可能的..所以不,我们不能做构造函数覆盖,因此我们可以做构造函数重载。
【讨论】: