2012-03-04 243 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