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

Make ShowBike.Bicycle static.

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

In Java there are two types of nested classes: "Static nested class" and "Inner class". Without the static keyword it is an inner class and you will need an instance of ShowBike to access ShowBike.Bicycle:

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

Static nested classes and normal (non-nested) classes are almost the same in functionality, it's just different ways to group things. However, when using static nested classes, you cannot put definitions of them in separated files, which will lead to a single file containing a lot of class definitions.

于 2013-03-11T05:39:23.653 に答える
7

Bicycle is an inner class, so you need outer class instance to create inner class instance like :

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

Or you can simply declare Bicycle class as static to make your current way work.

于 2013-03-11T05:39:33.293 に答える
3

The main method cannot access a non-static member of its class.

By the way, classes should be named after nouns, not verbs. So a better way to do it is :

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

Your Bicycle class is not static, and therefore cannot be used in a non-static method. If you want to use it in the main method, change it to

private static class Bicycle
于 2013-03-11T05:39:50.590 に答える