【问题标题】:Java accessing instance variablesJava 访问实例变量
【发布时间】:2012-03-04 21:41:51
【问题描述】:

我怎样才能使名为 rooms 的对象数组可以被最后调用的静态方法调用 retrieveRoom();我尝试了公共静态房间房间 [] = 新房间 [3]。但我只是从中得到错误。任何帮助表示赞赏。

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];
    }

}

【问题讨论】:

    标签: java static static-methods


    【解决方案1】:

    移动

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

    从您的 main() 方法中,到像这样的声明部分

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

    这将在您的MasterControlPanel 类中定义一个rooms 静态成员

    这里有一些其他提示:

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

    下面是代码

    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;
        }
    }
    

    【讨论】:

    • 变量必须是静态的才能被静态方法访问。
    • 没有实例的静态方法不能使用成员属性;你的编辑没有解决这个问题——你的代码不会编译。
    • 现在可以了,尽管答案中仍然存在新旧代码/措辞的麦克风。
    • 非常感谢您的宝贵时间!完美。
    • @DaveNewton 感谢您的关注。在您发表评论后,我试图对其进行改进。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-21
    • 2023-03-15
    • 1970-01-01
    相关资源
    最近更新 更多