0

Java でコーディングしているときに、メソッドによって呼び出されるフィールドを見たことがあることに気付きました。

System.out.println(object.field);

そしてクラス別:

System.out.println(Class.field);

私の教科書では、これら 2 つのケースのセマンティクスが何であるかについて明確な区別を見たことがありません。少なくとも初心者にとっては微妙なポイントになるのではないかと心配しています。私の直感では、クラス呼び出しは静的フィールドに使用されますか? みんなありがとう。とても混乱しています。

4

5 に答える 5

3

object.fieldインスタンスメンバーである必要があります(以下の注を参照)Class.field静的メンバーになります。

注: @radai が述べたように、言及する価値があると思いますが、オブジェクト インスタンスを介して静的メンバーにアクセスすることもできますが、これは非常に誤解を招く非常に悪い習慣です。

于 2013-10-17T03:08:28.787 に答える
1

クラスのインスタンスを作成せずにフィールドClass.fieldにアクセスできます。これらはstatic、クラスローダーによってクラスがロードされるときに初期化されるフィールドです。

もう 1 つのフィールド ieobject.fieldは、クラスのインスタンスが作成されたときにのみアクセスできます。これらはinstance、コンストラクターを呼び出してクラスのオブジェクトが作成されるときにフィールドが初期化されます。

于 2013-10-17T03:13:27.967 に答える
1

クラスごとにフィールドを参照するには、フィールドが静的である必要があります。

オブジェクトによってフィールドを参照するには、フィールドが static または non-static フィールドのいずれかである必要があります。

于 2013-10-17T03:13:30.160 に答える
1

インスタンス スコープとクラス スコープ。

これをチェックしてください:

class Foobar {
  public final int x = 5;
  public static final int y = 6;
}

yコンパイル時に一度だけ作成される変数です。クラスにバインドされているため、そのすべてのインスタンスで共有されます。これを で参照しFoobar.yます。

System.err.println(Foobar.y);

x一方、 はインスタンス変数であり、Foobar作成したものはすべてそのnewコピーを持ちます。次のように参照します。

Foobar foobar = new Foobar();
System.err.println(foobar.x);

しかし、これはうまくいきません:

System.err.println(Foobar.x);
于 2013-10-17T03:09:31.210 に答える
1

私の直感では、クラス呼び出しは静的フィールドに使用されます

はいの場合にSomeClass.fieldのみ使用できます。この場合、次のように参照を介してアクセスすることもできますが、このコードはコンパイラによって変更されます。また、誤解を招く可能性があるため (非静的フィールドを使用しようとしているように見える場合があります)、クラスごとに静的フィールドを使用することをお勧めします。fieldstaticsomeClassRef.fieldReferenceType.field

が静的でない場合fieldは、何らかのインスタンスに属している必要があるため、参照を介して呼び出す必要がありますsomeClassRef.field

于 2013-10-17T03:09:32.313 に答える