如何从另一个类中访问作为对象的局部变量? - Java

时间:2013-09-03 02:10:09

标签: java arrays class object

我的理解是你不能做我要问的事。如果您查看下面代码中的已加星标( * )注释错误,您可以看到我正在尝试访问的内容。我觉得我需要能够这样做,以便我可以使用方法动态创建许多对象,然后从其他对象访问所有这些对象。

有没有办法做到这一点,我错过了,或者我只是弄乱了什么?如果没有,我该怎么做才能让我获得与下面相同的功能?如果除了传递对象之外还有任何方法可以做到这一点,我们将不胜感激(传递对象似乎非常重要 - 特别是对于多维对象数组 - 应该有一种简单的方法来实例化包 - 私有对象,它可以可以在包中的任何其他地方访问)。但如果传递是唯一的方法,请让我知道最好的方法,特别是当我传递一堆对象的二维数组时。谢谢!

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();
    }
}

4 个答案:

答案 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类中作为引擎。你实际上正在操纵同一个对象。

enter image description here

至于你的另一个问题(第一个问题):它无法识别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();
    }
}