如何在Java基类中通过for循环调用四个派生子类的构造方法?
问题:Java中通过数组与循环调用不同子类构造方法
需要在基类中调用两个派生类(ClassA、ClassB)各自的两个子类(ClassA1、ClassA2、ClassB1、ClassB2)的构造方法,这四个子类构造方法参数长度不同。想通过数组和for循环实现,但遇到类型匹配问题:
- 数组类型设为Base,不知道如何直接调用子类构造
- 数组类型设为ClassA,无法存入ClassB相关子类实例
- 数组类型设为具体子类(如ClassA1),其他类实例无法存入
希望得到完整的类实现示例,实现类似Array[x] value = new Arrayx;的逻辑。
完整实现示例
public class Base { int year; String brand; String name; Base() { year = 0; brand = "Default"; name = "Default"; } Base(int year, String brand, String name) { this.year = year; this.brand = brand; this.name = name; } void display() { System.out.println("Year: " + year + "\nBrand: " + brand + "\nName: " + name); } public static void main(String[] args) { // 用Base类型数组存放所有子类实例,利用多态特性 Base[] obj = new Base[4]; // 直接实例化各个子类存入数组 obj[0] = new ClassA1(); obj[1] = new ClassA2(); obj[2] = new ClassB1(); obj[3] = new ClassB2(); // 循环调用每个实例的display方法,多态自动执行子类实现 for (Base item : obj) { item.display(); System.out.println("------------------------"); } } } public class ClassA extends Base { int playerCount; boolean hasMods; double fileSize; ClassA() { playerCount = 0; hasMods = false; fileSize = 0; } ClassA(int year, String brand, String name, int playerCount, boolean hasMods, double fileSize) { super(year, brand, name); this.playerCount = playerCount; this.hasMods = hasMods; this.fileSize = fileSize; } @Override void display() { super.display(); System.out.println("Max Number of Players: " + playerCount + "\nModding Capability?: " + hasMods + "\nStorage: " + fileSize + " gb"); } } class ClassA1 extends ClassA { ClassA1() { super(2015, "Bethesda", "Fallout 4", 1, true, 30.0); } } class ClassA2 extends ClassA { ClassA2() { super(2007, "Bungie", "Halo 3", 4, false, 6.3); } } public class ClassB extends Base { int resolution; String platform; ClassB() { resolution = 0; platform = "Default"; } ClassB(int year, String brand, String name, int resolution, String platform) { super(year, brand, name); this.resolution = resolution; this.platform = platform; } @Override void display() { super.display(); System.out.println("Resolution: " + resolution + "p\nPlatform: " + platform); } } class ClassB1 extends ClassB { ClassB1() { super(2020, "Nintendo", "Animal Crossing", 1080, "Switch"); } } class ClassB2 extends ClassB { ClassB2() { super(2019, "Rockstar", "GTA 5", 4K, "PC"); } }
关键说明
- 数组类型选择:使用
Base[]数组,因为所有子类都继承自Base,Java多态特性允许将子类实例赋值给父类引用,解决类型兼容问题。 - 构造方法调用:直接在数组初始化时实例化具体子类(
new ClassA1()等),每个子类的无参构造会自动调用父类对应参数的构造方法,完成属性初始化。 - 多态方法执行:循环中调用
item.display()时,会自动执行当前实例所属子类的display方法,无需强制类型转换。
内容的提问来源于stack exchange,提问作者Takeshi DBXV
相关产品推荐
相关产品推荐

