所以我正在学习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
答案 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()
对象。