【问题标题】:How can I access a Local Variable which is an object from within another class? - Java如何访问作为另一个类中的对象的局部变量? - 爪哇
【发布时间】:2013-09-06 03:27:55
【问题描述】:

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

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

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

【问题讨论】:

  • 感谢您的所有回答。我真的很感激他们。
  • 这感觉像是设计的味道。我想这是一个图形应用程序,所以也许你应该考虑 MVC 模式。

标签: java arrays class object


【解决方案1】:

通过将Board 类作为参数传递给Board,您可以访问gameEngine。当您实例化您的 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
    }
}

看看消息驱动通信的概念。 reading this answer 可能会让你更清楚。

在我从上面链接的答案中获取的下图中,您可以将 f 想象为 Engine 类中的 engine 对象,将 c 想象为您的 Board 类中的引擎。你实际上是在操作同一个对象。

至于您的其他问题(第一个问题):它无法识别currentGame,因为您的范围内没有任何具有该名称的变量。

【讨论】:

  • 谢谢。对此,我真的非常感激。我只是想检查一下我的理解。如果我传递一个int,它会创建一个新的int,但是如果我传递一个对象,它仍然访问原始对象吗?对于所有原语与引用类型,这是否相同?谢谢。
  • 在 Java 中不可能通过引用传递原语。您可以通过传递对可变包装类实例的引用来绕过它。检查此答案以获取更多信息:stackoverflow.com/questions/4319537/…
【解决方案2】:

此时代码中的范围内没有任何名为“currentGame”的类型的变量。

此外,虽然 boardSize 是一个静态包保护变量,但方法 getBoardSize() 是一个实例变量。一种可能的解决方案是将方法设为静态并保护包,然后您可以这样做:

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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      【解决方案4】:

      我们只能使用类引用来调用静态方法。所以你可以让 play 成为一个静态方法。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-03
        • 1970-01-01
        • 2020-07-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多