Java创建子类实例时出错

Java创建子类实例时出错,java,Java,大家好,我在创建子类的实例时遇到问题: package room; public class Room { String roomNumber; int capacity; boolean projection; public Room(String rm, int n, boolean p) { roomNumber = rm; capacity = n; projection = p

大家好,我在创建子类的实例时遇到问题:

    package room;

    public class Room {

    String roomNumber;  
    int capacity;
    boolean projection;

    public Room(String rm, int n, boolean p) { 
        roomNumber = rm; 
        capacity = n;
        projection = p;
    }

    public String getRoomNumber() {
        return roomNumber;
    }

    public int getCapacity() {
        return capacity;
    }

    public boolean hasProjector() { 
        return projection;
    }


    public class ComputerLab extends Room {

    private String os;

    public ComputerLab(String rm, int n, boolean p, String os) {
        super(rm, n, p);
        this.os = os;
}

    public String getOS() {
        return os;
    }

    public void setOS(String update) {
        os = update;
    }

}

    public static void main(String[] args) {
        Room r;
        r = new ComputerLab("G102", 20, true, "WindowsXP"); 
        System.out.println(r.getCapacity());
    }
}
在我在主函数中创建ComputerLab对象的行中,我得到以下错误:

Exception in thread "main" java.lang.RuntimeException: Uncompilable source code - non-static variable this cannot be referenced from a static context
    at room.Room.main(Room.java:48)
有人能解释为什么会发生此错误以及如何修复它吗?非常感谢

试试看

new Room(...).new ComputerLab(...)

您的类
ComputerLab
是一个内部类。在java中,内部类需要一个封闭类的实例,但在
main()
中没有(它是一个静态方法)

尝试将内部类更改为
静态
——这意味着它不需要外部类的实例,方法是将定义更改为:

public class ComputerLab extends Room


因为内部类不是静态的,所以它需要一个周围类的实例。虽然有一种方法可以解决这个问题,但我相信您期望的行为将来自更像这样的代码

public class Room {

    protected String roomNumber;
    protected int capacity;
    protected boolean projection;

    public Room(String rm, int n, boolean p) {
        roomNumber = rm;
        capacity = n;
        projection = p;
    }

    public String getRoomNumber() {
        return roomNumber;
    }

    public int getCapacity() {
        return capacity;
    }

    public boolean hasProjector() {
        return projection;
    }

    public static void main(String[] args) {
        Room r = new ComputerLab("G102", 20, true, "WindowsXP");
        System.out.println(r.getCapacity());
    }
}

class ComputerLab extends Room {

    private String os;

    public ComputerLab(String rm, int n, boolean p, String os) {
        super(rm, n, p);
        this.os = os;
    }

    public String getOS() {
        return os;
    }

    public void setOS(String update) {
        os = update;
    }

}

您的内部类应该是静态的,以便像这样使用它。嵌套类的良好使用与给定嵌套类的帮助器类一样


我个人非常喜欢将类拆分为单独的文件。

您可以在ComputerLab类的声明中添加static:

public static class ComputerLab extends Room ...

要做的第一件事:不要试图运行无法编译的代码。您有一个编译错误,因此在尝试运行代码之前,您应该在错误列表中找到它。
public static class ComputerLab extends Room ...