创建对象时出现“非静态变量this无法从静态上下文中引用”的错误。

34

我写了下面的代码来测试Java中类和对象的概念。

public class ShowBike {
    private class Bicycle {
        public int gear = 0;
        public Bicycle(int v) {
            gear = v;
        }
    }

    public static void main() {
        Bicycle bike = new Bicycle(5);
        System.out.println(bike.gear);
    }
}

为什么在编译过程中会出现下面的错误?

ShowBike.java:12: non-static variable this cannot be referenced from a static context
        Bicycle bike = new Bicycle(5);
                       ^
5个回答

52

ShowBike.Bicycle静态化。

public class ShowBike {

    private static class Bicycle {
        public int gear = 0;
        public Bicycle(int v) {
            gear = v;
        }

    }

    public static void main() {
        Bicycle bike = new Bicycle(5);
        System.out.println(bike.gear);
    }
}

Java中有两种类型的嵌套类:"静态嵌套类"和"内部类"。如果没有static关键字,它就是一个内部类,您需要一个ShowBike实例来访问ShowBike.Bicycle

ShowBike showBike = new ShowBike();
Bicycle bike = showBike.new Bicycle(5);

静态嵌套类和普通类(非嵌套)在功能上几乎相同,只是分组方式不同。但是,在使用静态嵌套类时,您不能将它们的定义放在单独的文件中,这将导致一个文件包含许多类定义。



7
自行车是一个内部类,因此您需要外部类实例来创建内部类实例,例如:
ShowBike sBike = new ShowBike();
Bicycle bike = sBike.new Bicycle(5);

或者,您可以将Bicycle类声明为static,使当前的方式起作用。


3

主方法不能访问其类的非静态成员。

顺便提一下,类应该以名词而非动词命名。因此更好的做法是:

private class Bicycle {
    public int gear = 0;

    public Bicycle(int v) {
        gear = v;
    }

    public void showGear() {
        System.out.println(gear);
    }

    public static void main(String[] args) {
        Bicycle bike = new Bicycle(6);
        bike.showGear(); // Notice that the method is named after a verb
    }
}

2
你需要创建外部类对象而非内部类对象,或者将内部类声明为静态类。这样,在使用内部类时就不需要创建对象了。

1
你的 Bicycle 类不是静态的,因此不能在非静态方法中使用。如果你想在主方法中使用它,请将其更改为:
private static class Bicycle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接