Java:如何将FurnitureItem子类Chair/Desk存入网格并实现对象引用?
用父类二维数组搞定你的家具网格存储问题
嘿,这个问题其实很好解决,核心就是利用Java的多态特性——既然Chair和Desk都继承自FurnitureItem,我们完全可以用父类类型的二维数组来存储这些子类对象,完美匹配你的网格需求!
第一步:创建匹配网格的二维数组
先根据你的网格尺寸,定义一个FurnitureItem类型的二维数组。比如假设你的网格是5行5列,就这么写:
// 5行5列的家具网格,用父类类型声明 FurnitureItem[][] furnitureGrid = new FurnitureItem[5][5];
第二步:把椅子/桌子存入网格
直接把Chair或Desk的实例丢进对应单元格就行,多态会自动帮你处理类型兼容:
// 在网格(0,0)位置放一把椅子 furnitureGrid[0][0] = new Chair(); // 在(2,3)位置放一张桌子 furnitureGrid[2][3] = new Desk();
第三步:引用单元格里的家具对象
情况1:调用父类通用方法
如果FurnitureItem里有子类重写的方法(比如你代码里的itemPrice()),直接调用就行,不用额外转换:
// 调用(0,0)位置家具的定价方法 furnitureGrid[0][0].itemPrice();
情况2:访问子类特有属性/方法
要是需要用到Chair的armRests或者Desk的width这类子类独有的东西,就先用instanceof判断类型,再强制转换:
// 检查(0,0)是不是椅子,是的话获取扶手状态 if (furnitureGrid[0][0] instanceof Chair) { Chair targetChair = (Chair) furnitureGrid[0][0]; System.out.println("这把椅子有没有扶手:" + targetChair.armRests); } // 检查(2,3)是不是桌子,是的话获取宽度 if (furnitureGrid[2][3] instanceof Desk) { Desk targetDesk = (Desk) furnitureGrid[2][3]; System.out.println("这张桌子的宽度是:" + targetDesk.width); }
聊聊你之前的尝试为啥可能没成
- 用集合的话其实也可行,比如
ArrayList<ArrayList<FurnitureItem>>来模拟二维网格,但二维数组显然更贴合你要的网格结构,用起来更直观。 - 如果之前用父类数组没成功,大概率是在取出对象时没正确处理类型转换,或者数组初始化的方式不对——比如不小心声明成了子类数组,那肯定存不了另一个子类的对象。
内容的提问来源于stack exchange,提问作者nev
相关产品推荐
相关产品推荐

