在Java中从父级调用子类构造函数

时间:2017-12-07 13:18:19

标签: java oop inheritance

所以我正在学习java继承,我遇到了一个我不知道如何解决的情况。

我要做的是从超类中调用子类构造函数。我不知道这是否有意义,但我会尝试用一个例子来解释自己。

public class Phone {
    private String brand;
    private int weight;

    public Phone(String brand, int weight) {
        this.brand = brand;
        this.weight = weight;
    }

    public Phone(String brand, int weight, String tech) {
        // Here it is where I'm stuck
        // Call SmartPhone constructor with all the parameters
    }
}

public class SmartPhone extends Phone {
    private String tech;

    public SmartPhone(String Brand, int weight, String tech) {
        super(brand, weight);
        this.tech = tech;
    }
}

为什么我要这样做?

我希望能够不必处理主要的SmartPhone 我希望能够做到:

Phone nokia = new Phone("Nokia", 295); // <- Regular Phone Instance
Phone iphone = new Phone("iPhone", 368, "4G"); // <- SmartPhone instance

3 个答案:

答案 0 :(得分:2)

Phone iphone = new Phone("iPhone", 368, "4G"); // <- SmartPhone instance

这没有任何意义。如果您想要SmartPhone实例,则必须致电

Phone iphone = new SmartPhone("iPhone", 368, "4G");

不能从超类构造函数中调用子类构造函数。

如果希望通过传递的参数确定Phone的类型,可以使用静态工厂方法:

public class PhoneFactory {

    public static Phone newPhone (String brand, int weight) {
        return new Phone(brand, weight);
    }

    public static Phone newPhone (String brand, int weight, String tech) {
        return new SmartPhone(brand, weight, tech);
    }
}

Phone nokia = PhoneFactory.newPhone("Nokia", 295); // <- Regular Phone Instance
Phone iphone = PhoneFactory.newPhone("iPhone", 368, "4G"); // <- SmartPhone instance

答案 1 :(得分:0)

不可能在基类的构造函数中调用子类的构造函数。这有多种原因,但其中一个原因是派生类的构造函数,隐含地或显式地调用基类的构造函数。这会导致无限循环 您可以做的是:在基类中创建一个静态方法,决定应该创建哪个实例。

public class Phone
{
  ...

  public static Phone createPhone(String brand, int weight, String tech)
  {
    if (tech == null)
      return (new Phone(brand, weight));
    else
      return (new SmartPhone(brand, weight, tech));
  }

  ...

}

答案 2 :(得分:0)

您可以使用私有构造函数,并使用三个参数在SmartPhone()构造函数中实例化Phone()对象。