我的理解是你不能做我要问的事。如果您查看下面代码中的已加星标( * )注释错误,您可以看到我正在尝试访问的内容。我觉得我需要能够这样做,以便我可以使用方法动态创建许多对象,然后从其他对象访问所有这些对象。
有没有办法做到这一点,我错过了,或者我只是弄乱了什么?如果没有,我该怎么做才能让我获得与下面相同的功能?如果除了传递对象之外还有任何方法可以做到这一点,我们将不胜感激(传递对象似乎非常重要 - 特别是对于多维对象数组 - 应该有一种简单的方法来实例化包 - 私有对象,它可以可以在包中的任何其他地方访问)。但如果传递是唯一的方法,请让我知道最好的方法,特别是当我传递一堆对象的二维数组时。谢谢!
package simpleclasswithinclasstest;
class Game {
static int boardSize;
Engine gameEngine;
Game() {
}
public void run() {
gameEngine = new Engine();
gameEngine.play();
}
public int getBoardSize() {
return boardSize;
}
}
class Engine {
int boardSize;
Engine() {
}
public void play() {
this.boardSize = currentGame.getBoardSize(); // *****1 Error is here.
// *****It doesn't recognize currentGame, but I want it to.
}
void doNothing() {
}
}
class Board {
Board() {
}
void Test() {
gameEngine.doNothing(); // 2 *****Error is here.
// *****It doesn't recognize gameEngine.
}
}
public class SimpleClassWithinClassTest {
static Game currentGame;
public static void main(String[] args) {
currentGame = new Game();
currentGame.run();
}
}
答案 0 :(得分:3)
您可以通过gameEngine
课程将Board
作为参数传递给Board
来访问Board
。当您实例化class Engine {
int boardSize;
Engine () {
Board board = new Board(this);
}
public void play() {
}
void doNothing() {
// magic stuff in here
}
}
class Board {
Engine engine;
Board (Engine gameEngine) {
this.engine = gameEngine
}
void Test() {
engine.doNothing(); // No error here :-) and this engine is your main one
}
}
时,您可以执行以下操作:
f
看一下消息驱动通信的概念。 reading this answer可能会让您更清楚。
在下面的图片中,我从上面链接的答案中得出,您可以将Engine
想象为c
类中的引擎对象,{{1}在Board
类中作为引擎。你实际上正在操纵同一个对象。
至于你的另一个问题(第一个问题):它无法识别currentGame
,因为你的范围内没有任何带有该名称的变量。
答案 1 :(得分:1)
代码中该点的范围内没有任何名为“currentGame”的类型的变量。
此外,虽然boardSize是一个静态的包受保护的变量,但方法getBoardSize()是一个实例变量。一种可能的解决方案是使方法静态并对包进行保护,然后您可以执行此操作:
public void play() {
this.boardSize = Game.getBoardSize();
}
答案 2 :(得分:1)
这就像在1函数中初始化一个int变量并尝试从另一个函数访问它一样。
对象(你试图访问)超出代码部分的范围您正尝试访问。
您可以发送this
来解决此问题
作为参数并在相应的方法中将其作为对象接收。
答案 3 :(得分:1)
我们可以使用类引用来仅调用静态方法。所以你可以把游戏变成静态的方法。
class Engine {
int boardSize;
Engine() {
}
public void play() {
this.boardSize = currentGame.getBoardSize(); // *****1 Error is here.
// *****It doesn't recognize currentGame, but I want it to.
}
static void doNothing() {
}
}
class Board {
Board() {
}
void Test() {
Engine.doNothing();
}
}
另一种方法是从类中创建一个Object并访问该对象中的非静态方法。
class Engine {
int boardSize;
Engine() {
}
public void play() {
this.boardSize = currentGame.getBoardSize(); // *****1 Error is here.
// *****It doesn't recognize currentGame, but I want it to.
}
void doNothing() {
}
}
class Board {
Board() {
}
void Test() {
Engine gameEngine = new Engine();
gameEngine.doNothing();
}
}