如何在其他方法中使用main方法内创建的RandomGrid对象
问题分析与解决方案
我来帮你捋清楚当前代码里的核心问题,以及对应的解决办法:
先揪出几个关键问题
- 局部变量的访问限制:你在
main方法里创建的RandomGrid rGrid是局部变量,非静态的compareGrids方法根本无法直接访问它——这就是你没法在compareGrids里使用rGrid的根本原因。 - 错误调用main方法:你在
compareGrids里写的ButtonGrid.main(args)和ButtonGrid.main(rGrid)完全不符合语法逻辑:main方法的参数只能是String[],传rGrid会直接编译报错;而且每次调用main都会重新创建ButtonGrid对象,完全没必要,还会造成资源浪费。 - 栈溢出的潜在原因:之前把RandomGrid构造放在main外导致栈溢出,大概率是RandomGrid的构造函数里存在无限递归(比如构造里又new了RandomGrid实例),你可以对比ButtonGrid的构造实现,检查RandomGrid里有没有循环创建自身的逻辑。
修改后的代码方案
核心思路是把ButtonGrid和RandomGrid的实例改成类的成员变量,让compareGrids能直接访问到它们:
// 定义类成员变量,让compareGrids可以访问 private static ButtonGrid buttonGrid; private static RandomGrid rGrid; // 替换成你实际使用的宽高值 private static final int WIDTH = 10; private static final int LENGTH = 10; public static void main(String[] args) { // 初始化成员变量 buttonGrid = new ButtonGrid(WIDTH, LENGTH); rGrid = new RandomGrid(WIDTH, LENGTH); // 创建类实例并调用compareGrids方法 YourClass instance = new YourClass(); instance.compareGrids(); } public int compareGrids() { int numCorrect = 0; // 直接使用成员变量里的实例进行比较 for (int i = 0; i < WIDTH; i++) { for (int j = 0; j < LENGTH; j++) { // 注意:比较颜色推荐用equals,而非==(Color对象可能是不同实例但颜色值相同) if (buttonGrid.grid[i][j].getBackground().equals(rGrid.grid[i][j].getBackground())) { numCorrect++; } } } System.out.println(numCorrect); return numCorrect; }
额外小提醒
- 如果
ButtonGrid和RandomGrid里的grid是私有变量,记得给它们添加getGrid()这样的 getter 方法,然后把代码改成buttonGrid.getGrid()[i][j]的形式访问。 - Swing组件的背景色比较,用
equals()比==更可靠——==比较的是对象引用,而equals()才是真正比较颜色的数值。
内容的提问来源于stack exchange,提问作者amaze
相关产品推荐
相关产品推荐

