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

如何从另一个类中访问作为对象的局部变量JAVA,java,arrays,class,object,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();
    }
}

在代码中的该点,作用域中没有名为“currentGame”的任何类型的变量

此外,虽然boardSize是一个受静态包保护的变量,但getBoardSize()方法是一个实例变量。一种可能的解决方案是将方法设置为静态并保护包,然后可以执行以下操作:

public void play() {
    this.boardSize = Game.getBoardSize();
}

在代码中的该点,作用域中没有名为“currentGame”的任何类型的变量

此外,虽然boardSize是一个受静态包保护的变量,但getBoardSize()方法是一个实例变量。一种可能的解决方案是将方法设置为静态并保护包,然后可以执行以下操作:

public void play() {
    this.boardSize = Game.getBoardSize();
}

这类似于在1函数中初始化一个int变量并尝试从另一个函数访问它。

您尝试访问的对象在您试图访问的代码部分超出范围。

您可以通过发送
This
来解决此问题
作为参数,并在相应的方法中将其作为对象接收。

这就像在一个函数中初始化一个int变量,然后尝试从另一个函数访问它。

对象(您正在尝试访问)您试图访问的代码部分超出范围。

您可以通过发送

作为参数,并在相应的方法中将其作为对象接收。

您将通过
类访问
游戏引擎
,方法是将其作为参数传递给
。当您实例化
板时,您可以执行以下操作:

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
想象为
engine
类中的引擎对象,将
c
想象为
Board
类中的引擎。实际上,您正在操作同一对象


至于您的另一个问题(第一个问题):它无法识别
currentGame
,因为您的作用域中没有任何具有该名称的变量

通过将
类作为参数传递给
,您可以通过
类访问
游戏引擎。当您实例化
板时,您可以执行以下操作:

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
想象为
engine
类中的引擎对象,将
c
想象为
Board
类中的引擎。实际上,您正在操作同一对象


至于您的另一个问题(第一个问题):它无法识别
currentGame
,因为您的作用域中没有任何具有该名称的变量

我们只能使用类引用来调用静态方法。因此,您可以使播放成为静态方法

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();
    }
}
另一种方法是从类生成一个对象,并访问该对象中的非静态方法

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

我们只能使用类引用来调用静态方法。因此,您可以使播放成为静态方法

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();
    }
}
另一种方法是从类生成一个对象,并访问该对象中的非静态方法

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

非常感谢。我真的很感激。我只是想核实一下我的理解。如果我传递一个int,它将创建一个新的int,但是如果我传递一个对象,它仍然访问原始对象?这对所有的原语和引用类型都一样吗?谢谢。在Java中,通过引用传递原语是不可能的。您可以通过传递对可变包装器类实例的引用来绕过它。查看此答案以了解更多信息:谢谢。我真的很感激。我只是想核实一下我的理解。如果我传递一个int,它将创建一个新的int,但是如果我传递一个对象,它仍然访问原始对象?这对所有的原语和引用类型都一样吗?谢谢。在Java中,通过引用传递原语是不可能的。您可以通过传递对可变包装器类实例的引用来绕过它。查看此答案以了解更多信息:感谢您提供的所有答案。我真的很感激他们。这感觉像是设计的味道。我想这是一个图形化的应用程序,所以也许你应该考虑MVC模式。谢谢你的所有答案。我真的很感激他们。这感觉像是设计的味道。我想这是一个图形应用程序,所以也许你应该考虑MVC模式。