Java 在某些条件下如何调用超级构造函数?
在某些情况下,是否可以调用超级构造函数?我有下面的代码Java 在某些条件下如何调用超级构造函数?,java,Java,在某些情况下,是否可以调用超级构造函数?我有下面的代码 private static final class AuditDataTable extends AuditDataModel<DiscrepanciesVO> { private AuditDataTable (){ super(); } } 但我希望在某些条件为false时不调用顶级类super()构造函数 这不太好,但很有效(不是直接回答你的问题,
private static final class AuditDataTable extends AuditDataModel<DiscrepanciesVO> {
private AuditDataTable (){
super();
}
}
但我希望在某些条件为
false
时不调用顶级类super()
构造函数 这不太好,但很有效(不是直接回答你的问题,而是解决你问题的方法)。您必须在初始化之前选择哪个构造函数,因此您不需要依赖于您的super。请注意,doSuper从未被使用过,决策点也被推迟。根据要求,提供了一个几乎完整的工作示例:
private static final class AuditDataTable extends AuditDataModel<DiscrepanciesVO> {
private AuditDataTable(boolean doSuper){
super();
}
private AuditDataTable(){
//other constructor
}
AuditDataTable getAuditDataTable(boolean useSuper){
AuditDataTable auditDataTable;
if(useSuper)
auditDataTable = new AuditDataTable(true);
else
auditDataTable = new AuditDataTable();
return auditDataTable;
}
}
私有静态最终类AuditDataTable扩展了AuditDataModel{
私有AuditDataTable(布尔doSuper){
超级();
}
私有AuditDataTable(){
//其他构造函数
}
AuditDataTable getAuditDataTable(布尔值useSuper){
AuditDataTable AuditDataTable;
如果(使用超级)
auditDataTable=新的auditDataTable(真);
其他的
auditDataTable=新的auditDataTable();
返回auditDataTable;
}
}
在任何情况下,构造函数都会调用超级构造函数。
选择“调用/不调用”的问题问得不好。
请注意:
public class UpperClass {
public UpperClass()
{
System.out.println("UpperClass");
}
public UpperClass(int a)
{
System.out.println("UpperClass 1");
}
}
及
不使用super(1)或使用super(1)时,在创建低类对象时,您会得到:
上流社会
下层
或
上等生1
下层
那么问题是:您想要哪一个超级构造函数,使用哪一个标准?
然后
1您必须有2个(或多个)超级构造函数,或者只有一个具有参数
2您必须将此条件从子类传递到超类而不是。无论您是否自己添加超级调用,它都是/必须是构造函数所做的第一件事。
super()
调用始终必须是构造函数中的第一个调用。你无法避免它。你可以调用super(boolean)
(并在你的超类中创建相应的构造函数),如果它是true
/false
,你可以做任何你想做的事。你必须调用父类的构造函数。这不是可选的。看到真正需要解决的问题并理解这个略带臭味的设计是从哪里来的会很有趣。如果超类需要初始化,则必须初始化。如果子类不需要初始化,可能它不需要父类的功能,那么它就不应该是子类,而是他的构造函数。他可以从内部调用它(这就是为什么我添加的构造函数也是私有的)。。。请在投票否决之前考虑一下!旧的答案不起作用,因为这是最终答案。。。很抱歉,您在初始化时做出选择。例如:AuditDataTable AuditDataTable;如果(yourBoolean)auditDataTable=新的auditDataTable(true);else auditDataTable=新的auditDataTable()
@SubodhJoshi使用getAuditDataTable(布尔)方法,您可以得到一个示例,在这个示例中,您必须应用您的新决策。@ctst而不是直接调用构造函数,我必须调用cgetAuditDataTable()
public class UpperClass {
public UpperClass()
{
System.out.println("UpperClass");
}
public UpperClass(int a)
{
System.out.println("UpperClass 1");
}
}
public class LowerClass extends UpperClass {
public LowerClass()
{
super(1);
System.out.println("LowerClass");
}
}