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

Java继承扩展类时修改成员变量类型的正确实现方法

问题根源

你遇到的问题由两个原因导致:

  • Sim2中新增的grid2是完全独立于父类Sim1的grid1的新成员,父类draw方法固定读取grid1的内容。Sim2实例化时会先执行父类Sim1的无参构造,将grid1初始化为Grid1类型对象,和子类的grid2没有任何关联,所以渲染的始终是Grid1的内容
  • 原有代码的增强for循环中,i是数组元素的临时拷贝,修改i不会写入数组本身,update方法执行后数组内容不会发生任何变化,同时原有代码存在class未小写、extends拼写错误、方法缺失返回值、super调用缺分号等语法问题
修复方案

方案1:直接复用父类成员(快速适配)

不需要在Sim2中新增grid2变量,直接在子类构造中覆盖父类的grid1赋值为Grid2实例即可,依托Java多态特性会自动调用Grid2重写后的update方法:

先修正Grid类的语法与逻辑错误

class Grid1 {
    public int a;
    public int grid[];

    public Grid1(int a) {
       this.a = a;
       grid = new int[50];
    }
    
    public void update() {
       // 改为普通for循环修改数组实际值
       for (int i = 0; i < grid.length; i++) {
           grid[i] += a;
       }
    }
}

class Grid2 extends Grid1 {
    public Grid2(int a) {
       super(a);
    }
    
    @Override
    public void update() {
       for (int i = 0; i < grid.length; i++) {
           grid[i] += 2*a;
       }
    }
}

修正Sim类逻辑

class Sim1 {
    public Grid1 grid1;

    public Sim1() {
       grid1 = new Grid1(10);
    }
    
    public void draw() {
       draw_list(grid1);
    }
}

class Sim2 extends Sim1{
    public Sim2() {
        // 直接覆盖父类的grid1为Grid2实例,不需要额外定义grid2
        this.grid1 = new Grid2(10);
    }
}

方案2:泛型重构(适合仿真场景长期扩展)

针对你要开发多种自动机仿真的需求,用泛型抽象基类可以保证类型安全,后续新增其他Grid规则不需要修改基础框架逻辑:

// 泛型基类,限定泛型参数为Grid1或其子类
class Sim<T extends Grid1> {
    public T grid;

    public Sim(T grid) {
        this.grid = grid;
    }
    
    public void draw() {
       draw_list(grid);
    }
}

// 移民自动机仿真
class Sim1 extends Sim<Grid1> {
    public Sim1() {
        super(new Grid1(10));
    }
}

// 康威生命游戏仿真
class Sim2 extends Sim<Grid2> {
    public Sim2() {
        super(new Grid2(10));
    }
}

这种写法下,你在Sim2中直接操作grid就是Grid2类型,不需要额外做类型转换,后续扩展新的自动机规则只要新增对应的Grid子类和Sim子类即可。

内容的提问来源于stack exchange,提问作者wil123

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 08:48:00