Java 如何实例化一个调用自身另一个实例化的类?
我正在尝试编写一个rubiks立方体,我希望立方体的每个面都有六个面类。在这个类中,为了正确移动立方体,我需要访问立方体四面的面,所以我尝试在面的构造函数中包含四个其他面对象。我想知道这个实例化是否有效。我是这样做的(第一块代码在主类中,第二块来自Face类):Java 如何实例化一个调用自身另一个实例化的类?,java,instantiation,Java,Instantiation,我正在尝试编写一个rubiks立方体,我希望立方体的每个面都有六个面类。在这个类中,为了正确移动立方体,我需要访问立方体四面的面,所以我尝试在面的构造函数中包含四个其他面对象。我想知道这个实例化是否有效。我是这样做的(第一块代码在主类中,第二块来自Face类): white=新面孔(红色、蓝色、绿色、橙色、彩色、白色); 黄色=新面孔(橙色、蓝色、绿色、红色、彩色、黄色); 红色=新面孔(黄色、蓝色、绿色、白色、彩色、红色); 橙色=新面孔(白色、蓝色、绿色、黄色、颜色为橙色); 蓝色=新面孔(
white=新面孔(红色、蓝色、绿色、橙色、彩色、白色);
黄色=新面孔(橙色、蓝色、绿色、红色、彩色、黄色);
红色=新面孔(黄色、蓝色、绿色、白色、彩色、红色);
橙色=新面孔(白色、蓝色、绿色、黄色、颜色为橙色);
蓝色=新面孔(红色、黄色、白色、橙色、彩色、蓝色);
绿色=新面孔(红色、白色、黄色、橙色、颜色。绿色);
前=黄色;
公共面顶部、左侧、右侧、底部;
公共小区[][]个小区;
公共面(t面、l面、r面、b面、c色){
top=t;
左=l;
右=r;
底部=b;
单元格=新单元格[3][3];
对于(int行=0;行<3;行++){
for(int col=0;col<3;col++){
单元格[行][col]=新单元格(c);
}
}
}
此示例不起作用,因为在实例化对象之前无法引用它们,除非它们已声明为具有某种状态
这就是说,如果你有另一个对象,比如说块,它包含4个面对象,这将解决你的问题。一张脸可以由颜色组成,而块可以管理所有逻辑
枚举面{
白色(颜色,白色),
红色(颜色,红色),
蓝色(颜色,蓝色)
//其他要素
//建造师
//吸气剂
}
类块{
//班级成员
//细胞
公共块(面顶、面左、面右、面底){
//分配
}
}
您可以在没有相邻面的情况下先初始化面。然后,在初始化所有设置之后,通过setter定义它们之间的关系
class Face {
Face white = new Face(Color.WHITE);
Face yellow = new Face(Color.YELLOW);
{
white.setRight(yellow);
yellow.setLeft(white);
}
public Face top, left, right, bottom;
public Cell[][] cells;
public Face(Color c) {
// only cells init
}
public void setLeft(Face left) {
this.left = left;
}
public void setRight(Face right) {
this.right = right;
}
}
我通常做的是添加一个初始化函数,该函数在实例化所有对象后使用,并将需要其他实例的代码移到那里。这样,在调用代码时,您已经有了有效的引用:
// Instantiate the objects:
white = new Face(Color.WHITE);
yellow = new Face(Color.YELLOW);
red = new Face(Color.RED);
orange = new Face(Color.ORANGE);
blue = new Face(Color.BLUE);
green = new Face(Color.GREEN);
// Initialize the objects:
white.intitializeFace(red, blue, green, orange);
yellow.intitializeFace(orange, blue, green, red);
red.intitializeFace(yellow, blue, green, white);
orange.intitializeFace(white, blue, green, yellow);
blue.intitializeFace(red, yellow, white, orange);
green.intitializeFace(red, white, yellow, orange);
front = yellow;
公众面孔(c色){
单元格=新单元格[3][3];
对于(int行=0;行<3;行++){
for(int col=0;col<3;col++){
单元格[行][col]=新单元格(c);
}
}
}
公共无效初始化面(t面、l面、r面、b面){
top=t;
左=l;
右=r;
底部=b;
}
// Instantiate the objects:
white = new Face(Color.WHITE);
yellow = new Face(Color.YELLOW);
red = new Face(Color.RED);
orange = new Face(Color.ORANGE);
blue = new Face(Color.BLUE);
green = new Face(Color.GREEN);
// Initialize the objects:
white.intitializeFace(red, blue, green, orange);
yellow.intitializeFace(orange, blue, green, red);
red.intitializeFace(yellow, blue, green, white);
orange.intitializeFace(white, blue, green, yellow);
blue.intitializeFace(red, yellow, white, orange);
green.intitializeFace(red, white, yellow, orange);
front = yellow;
public Face(Color c) {
cells = new Cell[3][3];
for(int row = 0; row < 3; row++) {
for(int col = 0; col < 3; col++) {
cells[row][col] = new Cell(c);
}
}
}
public void intitializeFace(Face t, Face l, Face r, Face b) {
top = t;
left = l;
right = r;
bottom = b;
}