You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 19:46:00