如何从另一个类中访问作为对象的局部变量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模式。