2

内部クラスの使用方法を学んでいますが、コンパイルしようとすると厄介なエラーが発生します。内部クラスと外部クラスが互いの変数とメソッドをどのように使用できるかを確認しようとしています。

このコードをコンパイルしようとすると、次のように表示されます。

.../src/MyOuter.java:39: non-static variable inner cannot 
be referenced from a static context

コード:

public class MyOuter{
    private int x;

    public MyInner inner = new MyInner();

    public int getOuterX(){
        return x;
    }
    private void doStuff(){
        inner.go();
    }

    class MyInner{
        public int getInnerX(){
            return x;
        }
        void go(){
            x = 42;
        }
    }
    public static void main(String[] args) {
        MyOuter outer = new MyOuter();
        outer.doStuff();
        System.out.println("outer.x = " + outer.getOuterX());
        System.out.println("inner.x = " + inner.getInnerX());

    }
}

助けてくれてありがとう!

4

2 に答える 2

3

getInnerX()メソッドはMyInnerクラスで定義されているため。MyInnerclass のオブジェクトがないと直接アクセスできないので、行を変更します

 System.out.println("inner.x = " + inner.getInnerX());  

System.out.println("inner.x = " + outer.inner.getInnerX());
于 2013-08-29T19:07:15.327 に答える
2

inner前述のように、変数を static main メソッドで参照する前に、まず変数を抽出する必要があります。次のようなことを試してください。

{
    public static void main(String[] args) {
    MyOuter outer = new MyOuter();
    MyInner inner = outer.inner;
    outer.doStuff();
    System.out.println("outer.x = " + outer.getOuterX());
    System.out.println("inner.x = " + inner.getInnerX());
}

インスタンスとクラスメンバーの理解から:

宣言に static 修飾子があるフィールドは、静的フィールドまたはクラス変数と呼ばれます。オブジェクトではなく、クラスに関連付けられています。クラスのすべてのインスタンスは、メモリ内の 1 つの固定位置にあるクラス変数を共有します。どのオブジェクトでもクラス変数の値を変更できますが、クラスのインスタンスを作成せずにクラス変数を操作することもできます。

内部変数はオブジェクトに関連付けられているため、静的変数のように参照することはできません。静的な場合、「MyOuter」のすべてのインスタンス間で共有され、そこで試した方法でアクセスできます。

于 2013-08-29T19:09:35.393 に答える