2012-03-04 93 views
1

如何使名为rooms的对象数组可以在名为retrieveRoom()的末端的静态方法中访问;我尝试了公共静态房间[] =新房间[3]。但我只是从中得到了一些错误。任何帮助表示赞赏。Java访问实例变量

public class MasterControlPanel{ 

    public static void main(String[] args){ 

    Rooms rooms[] = new Rooms[3]; 

    rooms[0] = new Rooms("Room U", 1, 4, 4); 
    rooms[1] = new Rooms("Room U", 2, 4, 4); 
    rooms[2] = new Rooms("Connector X", 3, 2, 4); 
    rooms[3] = new Rooms("Connector U", 4, 2, 4); 

    for(int x = 0; x <= rooms.length; x++){ 
     rooms[x].createLights(); 
     rooms[x].createWalls(); 
    } 
    } 

    public static Object retrieveRoom(int connectedRoom){ 

    connectedRoom -= 1; 
    return rooms[connectedRoom]; 
    } 

}

回答

3

移动

public static Rooms[] rooms = new Rooms[4]; 

你的main()方法,像这样

public class MasterControlPanel { 
    public static Rooms[] rooms = new Rooms[4]; 
    public static void main(String[] args) { 
    ... 
    } 
} 

声明部分这将定义一个rooms静态成员MasterControlPanel类。

这里有一些其他提示:

  1. 静态成员可以,只要是Class存在访问。但是,为了访问实例成员(属于该类的实例的变量),需要该类的一个实例。
  2. 使用Rooms[] rooms = new Rooms[4];。请注意,数组括号被移至Type部分,这将防止将来的混淆。 “让我们用名称空间定义一个房间阵列”。这不是必需的,但这是一件好事。
  3. 您正在定义rooms阵列,其大小为但是您正在向其添加元素。这将导致ArrayIndexOutOfBounds异常。
  4. 您应该让您的会员private达到Encapsulation。您可以提供publicprotected方法来从班级中检索那些private成员。
  5. 当一个数组包含n个元素时,您可以在该数组上进行的最大连续迭代次数也是n。这意味着在for循环中确保您的循环条件为n-1为最后一次迭代。请记住,4数组中没有4 th元素。

这里如下

public class MasterControlPanel { 
    public static Room[] rooms = new Room[4]; 

    public static void main(String[] args) { 

     rooms[0] = new Room("Room U", 1, 4, 4); 
     rooms[1] = new Room("Room U", 2, 4, 4); 
     rooms[2] = new Room("Connector X", 3, 2, 4); 
     rooms[3] = new Room("Connector U", 4, 2, 4); 

     for (int x = 0; x <= rooms.length-1; x++) { 
      rooms[x].createLights(); 
      rooms[x].createWalls(); 
     } 
    } 

    public static Room retrieveRoom(int connectedRoom) { 
     connectedRoom -= 1; 
     return rooms[connectedRoom]; 
    } 

} 

class Room { 
    // These are instance members for Room class 
    private String roomString; 
    private int roomInteger1, roomInteger2, roomInteger3; 

    public Room(String string, int integer1, int integer2, int integer3) { 
     // This is the constructor for Room object 
     this.roomString = string; 
     this.roomInteger1 = integer1; 
     this.roomInteger2 = integer2; 
     this.roomInteger3 = integer3; 
    } 

    public void createLights() { 
     // This method creates lights 
    } 

    public void createWalls() { 
     // This method creates walls 
    } 

    // These are Getters and Setters for Room members 
    public String getRoomString() { 
     return roomString; 
    } 

    public void setRoomString(String roomString) { 
     this.roomString = roomString; 
    } 

    public int getRoomInteger1() { 
     return roomInteger1; 
    } 

    public void setRoomInteger1(int roomInteger1) { 
     this.roomInteger1 = roomInteger1; 
    } 

    public int getRoomInteger2() { 
     return roomInteger2; 
    } 

    public void setRoomInteger2(int roomInteger2) { 
     this.roomInteger2 = roomInteger2; 
    } 

    public int getRoomInteger3() { 
     return roomInteger3; 
    } 

    public void setRoomInteger3(int roomInteger3) { 
     this.roomInteger3 = roomInteger3; 
    } 
} 
+1

的变量需要是静态的是通过静态方法访问的代码。 – 2012-03-04 21:45:57

+0

成员属性不可用于没有实例的静态方法;你的编辑没有解决这个问题 - 你的代码不会编译。 – 2012-03-04 22:02:06

+0

现在确实如此,尽管答案中仍然存在新旧代码/措辞的麦克风。 – 2012-03-04 22:04:32