2

static を使用するときはいつでも、クラスの参照変数を作成する必要はありません。の助けを借りてクラスに直接アクセスできます<class_name>

しかし、次のコードを書くと:

class Abc
{
    static void show()
    {
        System.out.println("Hey I am static");
    }
}

class Test
{
    public static void main(String args[])
    {
        Abc.show();            //1
        new Abc().show();      //2
    }
}

1行目と2行目の両方がどのように機能しますか。の意義は何ですか

new Abc().show();
4

5 に答える 5

3

インスタンスを使用することは (機能しますが) 、メソッドを呼び出す(または静的フィールドにアクセスする) 方法としては正しくありません。これは、 staticがインスタンスではなくクラス/タイプのメンバーであることを示すためです。static

したがって、コンパイラはインスタンスをClass型に置き換えます (静的バインディングのため)。つまり、実行時ABC.show()にの代わりに が実行されますnew ABC().show()

ただし、ソース コードは依然としてわかりにくいものです。したがって、これは悪い習慣と見なされ、Eclipse などの IDE から警告が出る場合さえあります。

于 2013-06-11T10:50:19.800 に答える
0

のように、インスタンスから静的メソッドを使用できますが、new Abc().show()混乱を招く可能性があり、推奨されません。

className.staticMethod()静的メソッドなどに固執しclassInstance.instanceMethod()ます。

于 2013-06-11T10:50:32.643 に答える
0

これは単純に、ABC に対してオブジェクトを作成し、オブジェクトを介してこの変数にアクセスしようとしていることを意味します。

ただし、コンパイル時に、

new Abc().show(); 

に変換されますAbc.show().

于 2013-06-11T10:51:59.080 に答える
0

static キーワードは、クラスごとに 1 つのコピーのみを提案します。メソッド static を作成し、 Classname.methodname() を使用してアクセスしています。これは、クラスが JVM にロードされるときにそのインスタンスが作成されるため、明示的に新しいオブジェクトを作成する必要がないためです。クラス。それが理にかなっていることを願っています。

于 2013-06-11T10:52:51.787 に答える
0

あなたの ABC クラスはデフォルトのコンストラクターをオーバーライドしなかったためです。

それは以下と同等です:

class Abc{
    public Abc(){super();}

    static void show(){
         System.out.println("Hey I am static");
    }
}

したがってnew Abc().show();、クラスの新しい Abc オブジェクトを作成し、このオブジェクトを介して ABC クラスの静的メソッドを呼び出すだけです (これは静的メソッドを呼び出す適切な方法ではないため、警告が表示されます)。

于 2013-06-11T10:50:18.697 に答える