gpt4 book ai didi

java - 非法前向引用,对象可见性问题将编译

转载 作者:行者123 更新时间:2023-12-02 08:29:32 26 4
gpt4 key购买 nike

感谢您花时间阅读。 =)

我遇到的问题主要是对象可见性。我正在创建对象并尝试在它们初始化或其中包含任何数据之前创建对它们的引用。您可以通过提供的代码了解我在这里尝试做什么。

某些方 block 可以看到其他方 block 等。现在我的代码可以编译了!问题是我有从这些对象返回 null 的 getter 方法。我尝试将所有初始化放在 Square 类声明中,但这就是我得到“非法前向引用”的地方。

最后,在代码块的末尾,您会注意到我如何尝试访问这些对象及其引用。所有四个都返回 null,我想要的是一些引用存在的指示。

我确实稍微理解这里出了什么问题,也许我处理对象的方法不正确?我认为我的业余技能主要是阻碍我做这件事的原因 =)

class Puzzle extends JFrame
{

Square square1;
Square square2;
Square square3;
Square square4;
Square square5;
Square square6;
Square square7;
Square square8;
Square square9;
Square square10;
Square square11;
Square square12;
Square square13;
Square square14;
Square square15;
Square square16;

public Puzzle()
{

PuzzleListener plist = new PuzzleListener();
JPanel puzzle_board = new JPanel(new GridLayout(4,4,5,5));

//randomize the text index's and the starting black square.

// Square(north, south, east,west,isblack,text)
square1 = new Square(null,square2,square5,null,false,"1");
square2 = new Square(null,square3,square6,square1,false,"2");
square3 = new Square(null,square4,square7,square2,false,"3");
square4 = new Square(null,null,square8,square3,false,"4");
square5 = new Square(square1,square6,square9,null,false,"5");
square6 = new Square(square2,square7,square10,square5,false,"6");
square7 = new Square(square3,square8,square11,square6,false,"7");
square8 = new Square(square4,null,square12,square7,false,"8");
square9 = new Square(square5,square10,square13,null,false,"9");
square10 = new Square(square6,square11,square14,square9,false,"10");
square11 = new Square(square7,square12,square15,square10,false,"11");
square12 = new Square(square8,null,square16,square11,false,"12");
square13= new Square(square9,square14,null,null,false,"13");
square14 = new Square(square10,square15,null,square10,false,"14");
square15 = new Square(square11,square16,null,square14,false,"15");
square16 = new Square(square12,null,null,square15,false,"16");

}



class Square extends JPanel
{

//visible lable
JLabel lblText;

//internal object ID
int id;

//Define the visible neighbors
Square north;
Square south;
Square east;
Square west;

//is the square black
boolean isBlack;

public Square(String text)
{

lblText = new JLabel(text);
//setLayout(new GridLayout(5,5));
lblText.setLocation(10,10000);
add(lblText);
}

public Square(Square n,Square e,Square s,Square w,boolean black, String text)
{

north = n;
east = e;
south = s;
west = w;

isBlack = black;

lblText = new JLabel(text);
//setLayout(new GridLayout(5,5));
lblText.setLocation(10,10000);
add(lblText);

}//end square

Square getNorthNeighbor()
{
return north;
}
Square getSouthNeighbor()
{
return south;
}
Square getEastNeighbor()
{
return east;
}
Square getWestNeighbor()
{
return west;
}
boolean getIsBlack()
{
return isBlack;
}


}


System.out.println("Panel 1 has been clicked and has the neighbors " + "North: " + square1.getNorthNeighbor() + "East: " + square1.getEastNeighbor() + "South: " + square1.getSouthNeighbor() + "West: " + square1.getWestNeighbor());

最佳答案

鉴于它们需要相互了解,为什么不先创建所有方 block ,然后使用一个 setNeighbours(Square east, Square South, ...) 方法,您可以在以下情况下调用该方法:您实际上已经创建了所有对象吗?就不变性而言,这并不好(通常对于类型来说是一个很好的属性),但从根本上讲,您已经得到了循环引用。

换句话来说,假设您必须创建两个 Person 实例,并向每个实例表明他们是兄弟。你不能这样做:

Person billy;
Person bobby;
billy = new Person(bobby);
bobby = new Person(billy);

但是你可以做:

Person billy = new Person();
Person bobby = new Person();
billy.setBrother(bobby);
bobby.setBrother(billy);

如果您能够从一开始就避免需要循环引用,那就更好了,但有时事情就是这样。

关于java - 非法前向引用,对象可见性问题将编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3773862/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com