“创建对象时,无法从静态上下文引用非静态变量”

时间:2013-03-11 05:36:24

标签: java oop inner-classes

我编写了下面的代码来测试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 个答案:

答案 0 :(得分:40)

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中有two types of nested classes:"静态嵌套类"和"Inner class"。如果没有static关键字,则它是一个内部类,您需要ShowBike的实例才能访问ShowBike.Bicycle

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

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

答案 1 :(得分:6)

Bicycle是一个内部类,因此您需要外部类实例来创建内部类实例,如:

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

或者您可以简单地将Bicycle课程声明为static,以使您当前的工作方式有效。

答案 2 :(得分:3)

main方法无法访问其类的非静态成员。

顺便说一下,类应该以名词命名,而不是动词。所以更好的方法是:

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

答案 3 :(得分:2)

您需要创建内部类的外部类对象instate。或者你需要将内部类作为静态。所以对于内部类,不需要任何对象。

答案 4 :(得分:1)

您的Bicycle类不是静态的,因此不能用于非静态方法。如果要在main方法中使用它,请将其更改为

private static class Bicycle