Java 如何将对象传递给类,以便当对象在类外更新时,它也会在类中过期?(爪哇)
我很难弄清楚如何在Java中通过引用传递。我目前有一门课,如下所示Java 如何将对象传递给类,以便当对象在类外更新时,它也会在类中过期?(爪哇),java,reference,Java,Reference,我很难弄清楚如何在Java中通过引用传递。我目前有一门课,如下所示 class Example { ArrayList<Foo> list; Bar hello; Example(ArrayList<foo> list, Bar hello) { this.list = list; this.hello = hello; } } 类示例{ 数组列表; 酒吧你好; 示例(ArrayList列表,Bar he
class Example {
ArrayList<Foo> list;
Bar hello;
Example(ArrayList<foo> list, Bar hello) {
this.list = list;
this.hello = hello;
}
}
类示例{
数组列表;
酒吧你好;
示例(ArrayList列表,Bar hello){
this.list=列表;
this.hello=你好;
}
}
在我的主类中,我初始化了一个Foo数组列表和一个Bar对象。然后初始化传入数组列表和Bar对象的示例。我想要的是,每当我传递给示例的对象在主类中更新时,它们也会在示例中更新。但目前,只有ArrayList被更新。但酒吧你好不是。是什么使ArrayList和它更新但Bar不更新的Bar不同
编辑
好的,这是实际代码的一部分:
public class Main {
static int
board_n = 1, // amount of boards
rows = 8, // board width
cols = 8; // board height
static ArrayList<Board> boardlist;
static Player player1 = new Player("Mr");
static Player player2 = new Player("9000");
static Player currentPlayer = player1;
static Move dummy = null;
public static void main(String[] args) {
int random_row, random_col, random_board, rand_i;
Dimension size = new Dimension(rows, cols);
boardlist = new ArrayList(board_n);
for(int i = 0; i < board_n; i++) {
boardlist.add(new Board(i, size));
}
Rules rulez = new Rules(boardlist, dummy, currentPlayer);
rulez.setPieces();
Random generator = new Random();
while(rulez.getPiecesAvailable("Checker", player1.getName()) > 0 || rulez.getPiecesAvailable("Checker", player2.getName()) > 0) {
// initialize points and generate random location
random_row = generator.nextInt(rows);
random_col = generator.nextInt(cols);
random_board = generator.nextInt(board_n);
Point point = new Point(random_row, random_col);
// initialize pieces and randomly set moveable
Piece hello1 = new Checker(player1.getName(), Integer.toString(random_row), Integer.toString(random_col), Integer.toString(0), -1);
Piece hello2 = new Checker(player2.getName(), Integer.toString(random_row), Integer.toString(random_col), Integer.toString(0), 1);
// add piece to board
if(rulez.validateAddition(new Location(point, random_board), hello1))
boardlist.get(random_board).addPiece(hello1, point);
if(rulez.validateAddition(new Location(point, random_board), hello2))
boardlist.get(random_board).addPiece(hello2, point);
}
currentPlayer = player2;
}
}
公共类主{
静态整数
线路板\u n=1,//线路板数量
行数=8,//板宽
cols=8;//板高
静态ArrayList董事会名单;
静态玩家player1=新玩家(“Mr”);
静态玩家player2=新玩家(“9000”);
静态播放器currentPlayer=player1;
静态移动虚拟=空;
公共静态void main(字符串[]args){
int random_row,random_col,random_board,rand_i;
维度大小=新维度(行、列);
boardlist=新阵列列表(board\n);
对于(int i=0;i0 | | rulez.getPiecesAvailable(“Checker”,player2.getName())>0){
//初始化点并生成随机位置
random_row=生成器.nextInt(行);
random_col=生成器nextInt(cols);
随机板=生成器.nextInt(板n);
点=新点(随机行、随机列);
//初始化工件并随机设置为可移动
工件hello1=新棋盘格(player1.getName(),Integer.toString(随机行),Integer.toString(随机列),Integer.toString(0),-1);
工件hello2=新棋盘格(player2.getName(),Integer.toString(随机行),Integer.toString(随机列),Integer.toString(随机列),Integer.toString(0),1);
//添加一块到板上
if(规则Z.validateAddition(新位置(点,随机板),hello1))
boardlist.get(随机板).addPiece(hello1,point);
if(规则Z.validateAddition(新位置(点,随机板),hello2))
boardlist.get(random_board).addPiece(hello2,point);
}
currentPlayer=player2;
}
}
创建规则对象时,我将boardlist、dummy和currentPlayer传递给它。当我向董事会列表添加内容时,规则内部的董事会列表与外部的董事会列表相同。但是在最后一句话中,当我将currentPlayer更改为player2时,规则不会更改。如果
Bar
不是一个基本类型,那么在类外对Bar
所做的任何更改也会影响类内的Bar
如果您试图通过将另一个对象重新指定给变量来更改Bar
,则更改不会反映在您的类中。(我有一种感觉,在您的代码中可能就是这种情况)
但是,如果Bar
是一种基本类型(int、double、char等),则您不能以现在的方式对其进行更改
解决方案强>
在您的这行代码中:
currentPlayer = player2;
您希望更改反映在您的类中。他们不会。您应该添加一个changeCurrentPlayer(playerP)
方法,并在您的类中重新分配当前播放器
该方法的实现可能类似于:
public void changeCurrentPlayer(Player newPlayer){
this.player = newPlayer;
}
如果
Bar
不是基本类型,则在您的类外对Bar
所做的任何更改也会影响类内的Bar
如果您试图通过将另一个对象重新指定给变量来更改Bar
,则更改不会反映在您的类中。(我有一种感觉,在您的代码中可能就是这种情况)
但是,如果Bar
是一种基本类型(int、double、char等),则您不能以现在的方式对其进行更改
解决方案强>
在您的这行代码中:
currentPlayer = player2;
您希望更改反映在您的类中。他们不会。您应该添加一个changeCurrentPlayer(playerP)
方法,并在您的类中重新分配当前播放器
该方法的实现可能类似于:
public void changeCurrentPlayer(Player newPlayer){
this.player = newPlayer;
}
如果看不到更多的代码,就无法确定,但我有一种预感,您的问题是在将
hello
传递给Example
的构造函数后,您正在将它重新分配给另一个实例。对于ArrayList
它之所以能像您所期望的那样工作,是因为您在同一ArrayList
实例上调用方法,而从未重新分配实际的列表,这是传递给Example
的构造函数的
编辑:
好的,现在我已经看到了您发布的实际代码,我看到我上面的预感是正确的。执行此操作时:
currentPlayer = player2;
您正在将currentPlayer分配给不同的实例。它不再指向传递给Rules
构造函数的同一实例。你真正想做的事情更像这样:
rulez.setPlayer(player2);
public void doNotDoThis(Bar hello) {
hello = new Bar();
hello.setFoo("new value"); // this won't be visible
}
public void changePlayer(Player aPlayer)
{
this.player = aPlayer;
}
public class Y
{
public static void main(final String[] argv)
{
X x = new X(42);
foo(x);
System.out.println(x.getA());
}
private static void foo(final X x)
{
x.setA(7);
}
}
public class Y
{
public static void main(final String[] argv)
{
X x = new X(42);
foo(x);
System.out.println(x.getA());
}
private static void foo(X x)
{
x = new X(28);
x.setA(7);
}
}
当然,您的
规则
类需要定义一个setPlayer(Player-Player)
方法才能工作。如果没有看到更多的代码,就无法确定,但我有一种预感,您的问题是您正在将hello
重新分配给另一个
public class Y
{
public static void main(final String[] argv)
{
X x = new X(42);
foo(x);
System.out.println(x.getA());
}
private static void foo(final X x)
{
x.setA(7);
}
}
public class Y
{
public static void main(final String[] argv)
{
X x = new X(42);
foo(x);
System.out.println(x.getA());
}
private static void foo(X x)
{
x = new X(28);
x.setA(7);
}
}
currentPlayer = player2;
Rules rulez = new Rules(boardlist, dummy, currentPlayer);