0

私は少しの C++ から Java を初めて使用し、静的メソッドを呼び出したり、クラスのインスタンスを持たずに静的フィールドにアクセスしたりするとどうなるか疑問に思っています。

class Foo {
    public final static Scanner _input = new Scanner(System.in);
}

class Bar {
    public final static Scanner _input = new Scanner(System.in);
}

...

SomeCode[Foo._input.nextInt()];

一時オブジェクトが作成されるとは想像できませんが、わかりません。ありがとう

4

5 に答える 5

4

クラスのインスタンスを持たずに静的メソッドを呼び出すか、静的フィールドにアクセスするとどうなるか疑問に思っています

フィールドにアクセスするだけです...それと同じくらい簡単です。のインスタンスを作成しませんFoo- その必要はありません。

フィールドは型のどのインスタンスにも関連付けられていません。型自体に関連付けられています。それがstatic基本的にJavaでの意味です。static残念ながら、C++ での の意味は多少異なりますが、無視するようにしてください。

注意すべきことの 1 つは、事実上 Java の設計上の問題です。参照を介して静的メンバーにアクセスできますが、期待どおりの結果にはなりません。例えば:

Foo foo = null;
Scanner scanner = foo._input;

それは -で強打するように見えますNullPointerExceptionが、そうではありません。そのコードは次と同等です。

Foo foo = null;
Scanner scanner = Foo._input;

最初の形式のコードはできるだけ避ける価値があります。特にメソッドを呼び出すときは、本当に誤解を招く可能性があります-呼び出しはインスタンスに依存しているように見えますが(そしてポリモーフィックである可能性があります)、実際には両方とも正しくありません:(

于 2013-06-06T05:58:34.020 に答える
1

staticフィールドはクラス自体に関連付けられています。それらの解決はコンパイル時に行われます。静的変数 (および静的初期化ブロック) の初期化は、クラスが JVM によってロードされるときに実行されます。

そのような変数 (またはメソッド) にアクセスする方法については、クラス名を使用できます。しかし、Java では、クラスのインスタンス変数を使用してそれを行うこともできます。ものも含めnullて!

これら 3 つの式はすべてbar、クラスで指定された静的変数にアクセスできますFoo(呼び出し元から見える場合bar)。

Foo.bar;            // using the class name
new Foo().bar;      // using an instance
((Foo) null).bar;   // using a null instance
于 2013-06-06T06:00:09.743 に答える
1

static と final の両方のキーワードを使用しましたが、どちらも意味が異なります。

static キーワードを使用して変数を宣言すると、クラス変数として宣言され、そのクラスのすべてのインスタンスに共通であることを意味します。クラス名を使用してアクセスし、インスタンスを使用する必要はありません。

例えば

Class Bycicle
{
   static String Type ='exercise';
    String Owner;

}

このクラスのインスタンスを 10 個作成すると、所有者のコピーが 1 個作成されますが、型は 10 個のオブジェクトすべてに対して共通のコピーが 1 つだけ残ります。1 つのオブジェクトがタイプ値を変更すると、他のすべてのオブジェクトに影響します。

static を final で宣言している場合は、すべてに共通であり、コンパイル時に宣言して初期化すると、変更することもできません。

詳細については、ここをクリックしてください。

于 2013-06-06T06:11:18.840 に答える
1

一時オブジェクトが作成されるとは想像できませんが、

いいえ。クラス オブジェクトを使用してメソッドを呼び出します。

于 2013-06-06T06:01:05.793 に答える
1

一時オブジェクトが作成されます???

static キーワードを使用して、クラスのインスタンスではなくクラスに属するフィールドとメソッドを作成します。

強くお勧めします

于 2013-06-06T05:58:27.303 に答える