java中的动态构造函数调用?

java中的动态构造函数调用?,java,inheritance,subtyping,Java,Inheritance,Subtyping,假设我有4个类:A,B,SA和SB,其中B扩展了A 和SB扩展SA 类A具有以下构造函数: private SA a; public A() { a = new SA(); } private SA a; public A() { this(new SA()); } protected A(final SA a) { this.a = a; } 显然,当我调用类B的构造函数时,因为B扩展了A 类A的构造函数也被调用。但在这种情况下,我希望 Ato doA=new SB()的

假设我有4个类:
A
B
SA
SB
,其中
B扩展了A
SB扩展SA

A
具有以下构造函数:

private SA a;
public A() {
   a = new SA();
}
private SA a;
public A() {
   this(new SA());
}
protected A(final SA a) {
   this.a = a;
}
显然,当我调用类
B的构造函数时,因为
B扩展了A
A
的构造函数也被调用。但在这种情况下,我希望
A
to do
A=new SB()的构造函数而不是
a=new SA()

有没有一个简单的方法可以做到这一点
更改
A
B
的公共接口?

是的。例如:

public A(YourEnum en) {
    if (en == YourEnum.SA){
        a = new SA();
    } else {
        a = new SB();
    }
}
此外,根据您真正需要的内容,可以通过重载构造函数来完成

public A(){
    a = new SA();
}

public A(YourObjectYouNeed dataNeededForAnotherConstructor){
    //doing initialization stuff
    a = new SB();
}

是的。例如:

public A(YourEnum en) {
    if (en == YourEnum.SA){
        a = new SA();
    } else {
        a = new SB();
    }
}
此外,根据您真正需要的内容,可以通过重载构造函数来完成

public A(){
    a = new SA();
}

public A(YourObjectYouNeed dataNeededForAnotherConstructor){
    //doing initialization stuff
    a = new SB();
}

只要有一个
公共
构造函数和一个
受保护的
构造函数:

private SA a;
public A() {
   a = new SA();
}
private SA a;
public A() {
   this(new SA());
}
protected A(final SA a) {
   this.a = a;
}
然后在
B
中:

public B() {
   super(new SB());
}

只要有一个
公共
构造函数和一个
受保护的
构造函数:

private SA a;
public A() {
   a = new SA();
}
private SA a;
public A() {
   this(new SA());
}
protected A(final SA a) {
   this.a = a;
}
然后在
B
中:

public B() {
   super(new SB());
}

依赖注入!不改变A和B的公共接口?不太好。@SotiriosDelimanolis好的,如果您可以更改
A
B
的公共接口,您会怎么做?最简单的方法是什么(减少更改)?使
A
的构造函数接受
SA
参数。为什么必须调用
A
的构造函数?只有在
B
的构造函数中调用
super
时才会发生这种情况。@ThatiditGuy Errr。。。否:如果构造函数体不是以显式构造函数调用开始,并且所声明的构造函数不是原始类对象的一部分,那么构造函数体将以超类构造函数调用“super();”依赖项注入隐式开始!不改变A和B的公共接口?不太好。@SotiriosDelimanolis好的,如果您可以更改
A
B
的公共接口,您会怎么做?最简单的方法是什么(减少更改)?使
A
的构造函数接受
SA
参数。为什么必须调用
A
的构造函数?只有在
B
的构造函数中调用
super
时才会发生这种情况。@ThatiditGuy Errr。。。否:如果构造函数体不是以显式构造函数调用开始的,并且所声明的构造函数不是原始类对象的一部分,那么构造函数体隐式地以超类构造函数调用“super();”开始,这看起来不是特别可维护的。如果我现在添加一个扩展了
a
C
,并希望传入一个
SC
,该怎么办?突然,OCP被违反了。您正在添加一个全新的依赖项,而不是删除一个。这看起来不是特别可维护的。如果我现在添加一个扩展了
a
C
,并希望传入一个
SC
,该怎么办?突然违反了OCP。您正在添加一个全新的依赖项,而不是删除一个。如果这两个类位于不同的包中,该怎么办。你不能做
super(newsb())。因为
A(最终SA A)
是protected@foobar不,受保护的
的全部要点是它可以被另一个包中的子类访问。看一看,如果这两个类在不同的包中呢。你不能做
super(newsb())。因为
A(最终SA A)
是protected@foobar不,受保护的
的全部要点是它可以被另一个包中的子类访问。看一看。