Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 希望在传递给父构造函数之前初始化成员_Java_Oop_Inheritance_Constructor - Fatal编程技术网

Java 希望在传递给父构造函数之前初始化成员

Java 希望在传递给父构造函数之前初始化成员,java,oop,inheritance,constructor,Java,Oop,Inheritance,Constructor,下面是我的难题的一个玩具示例: public abstract class Car { public Car(Seat[] seatsParam) { // Could be protected. driverSeat = new DriverSeat(); seats = new ArrayList<Seat>(); seats.add(driverSeat); seats.addAll(seatsPar

下面是我的难题的一个玩具示例:

public abstract class Car {
    public Car(Seat[] seatsParam) {    // Could be protected.
        driverSeat = new DriverSeat();
        seats = new ArrayList<Seat>();
        seats.add(driverSeat);
        seats.addAll(seatsParam);
    }
    private final List<Seat> seats;
    private final DriverSeat driverSeat;
}

public class MyCar extends Car {
    public MyCar() {
        super(new Seat[]{new PassengerSeat()});    // Cannot assign to member.
    }
    public PassengerSeat getPassengerSeat() {  // Would like this accessor.
        return passengerSeat;
    }
    private final PassengerSeat passengerSeat;
}
公共抽象类汽车{
公共汽车(座位[]座参数){//可以得到保护。
driverSeat=新的driverSeat();
seats=newarraylist();
座位。添加(驾驶员座位);
seats.addAll(seatsParam);
}
非公开最终名单席位;
私人最终驾驶员在驾驶员处;
}
公共级MyCar扩展了Car{
公共小汽车(){
超级(新席位[]{new PassengerSeat()});//无法分配给成员。
}
公共PassengerSeat getPassengerSeat(){//希望使用此访问器。
回程旅客电话;
}
私人最后乘客在PassengerSeat;
}
Car有一个座椅列表(座椅超类型),理想情况下在构造函数中初始化。每辆车都有一个司机室。MyCar还有一个PassengerSeat,我想从子类型访问它,但也可以从父列表(作为座位)访问它

我击落的一些东西:

  • 上面的代码:passengerSeat不会在子类中初始化。我可以在我的车的构造函数和downcast中得到这个列表,但这很难看
  • 让乘客保持静止:它不应该是静止的,因为可能会有许多其他MyCars具有独特的座椅
  • 让Car定义一个抽象的getSubclassSeats(),并向其添加driverSeat:这在构造函数中不起作用,因为PassengereAT尚未初始化。我可以让座位成为非最终的,然后在构造器之后再做,但是,再一次,丑陋

我想说的是,这是我应该能够在OO中表达的东西,定义一个变量并将其传递给父对象以供引用。但我想不出如何做得好。我用C++工作了一段时间,但是初始化列表是这样解决的吗?如果是这样的话,Java是否有一个等价物?

我见过有类似问题的人使用线程局部变量,天知道还有什么可怕的技巧,幸运的是有一个简单的解决方案:

public MyCar() {
    this(new PassengerSeat());   
}

private MyCar(PassengerSeat seat) {
    super(new PassengerSeat[]{seat});   
    // Well do something with your seat now.
}

我想另一个策略是让车内所有在座椅上运行的东西都单独运行driverSeat,然后获取childseats()。同样,它可以工作,但并不优雅。Tryy通过
new Seat[]{new PassengerSeat()}
。你没有通过arrayOh谢谢,我已经更新了。但我的问题不是编译,而是“new PassengerSeat()”在subtype.Awesome中丢失的事实。我一直认为构造函数只是调用继承链。@mr_dude在调用构造函数时委托它们是C++11的新特性-你没听说过它们也就不足为奇了。