web-dev-qa-db-ja.com

オブジェクトの作成時に「非静的変数thisは静的コンテキストから参照できません」

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);
                       ^
27
mko

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

In Javaがあります ネストされたクラスの2つのタイプ : "静的なネストされたクラス"および "内部クラス"staticキーワードは内部クラスであり、ShowBike.BicycleにアクセスするにはShowBikeのインスタンスが必要です。

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

静的なネストされたクラスと通常の(ネストされていない)クラスの機能はほぼ同じで、グループ化する方法が異なります。ただし、静的なネストされたクラスを使用する場合、それらの定義を個別のファイルに配置することはできません。これにより、多くのクラス定義を含む単一のファイルが作成されます。

40
Alvin Wong

自転車は内部クラスなので、次のような内部クラスインスタンスを作成するには外部クラスインスタンスが必要です。

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

または、単にBicycleクラスをstaticとして宣言して、現在の方法を機能させることができます。

6

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
ktm5124

内部クラスの状態の外部クラスオブジェクトを作成する必要があります。または、内部クラスを静的として作成する必要があります。したがって、内部クラスの場合、オブジェクトは不要です。

2
Janny

Bicycleクラスは静的ではないため、非静的メソッドでは使用できません。メインメソッドで使用する場合は、それを

private static class Bicycle
1
crazylpfan