32

我编写了以下代码来测试 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);
                       ^
4

5 回答 5

48

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

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

于 2013-03-11T05:39:23.653 回答
7

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

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

或者您可以简单地声明Bicyclestatic以使您当前的方式工作。

于 2013-03-11T05:39:33.293 回答
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
    }
}
于 2013-03-11T05:39:31.303 回答
2

您需要在内部类的状态下创建外部类对象。或者您需要将内部类设为静态。所以对于内部类不需要对象。

于 2013-03-11T05:42:04.477 回答
1

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

private static class Bicycle
于 2013-03-11T05:39:50.590 回答