明確にするために、私はこの権利を考えています.Javaでは、静的フィールドは変数/フィールドであり、クラス全体で使用されるか、そのクラスを参照するすべてのオブジェクトで使用できますか? 非静的フィールドは、オブジェクトによって定義された変数ですか? また、オブジェクト 1 と同じクラスを参照する 2 番目のオブジェクトは、オブジェクト 1 の static フィールドとは異なる値を持つことができますか?
6 に答える
クラス内の静的フィールドまたは静的クラス変数は、インスタンス変数とは異なり、そのクラスのインスタンスが作成される前にアクセスできます。クラス内のインスタンス変数 (非静的変数) は、そのクラスのインスタンスが実行時に作成されるときに作成されます。したがって、非静的変数には、そのクラスのインスタンスが作成されるまでアクセスできません。一方、静的クラス メンバーには、そのクラスが作成またはインスタンス化される前にアクセスできます。
そのクラスのすべてのインスタンスは、同じ静的変数にアクセスできます。一方、インスタンス変数は、クラスの各インスタンスに対して個別/カプセル化されています。
- すべてのオブジェクトで共有および使用され、クラスのロード時にロードされる static フィールド
- 非静的フィールドは、オブジェクトごとに個別のコピーであり、オブジェクトの作成時にロードされます
非静的フィールドは、オブジェクトによって定義された変数ですか?
新しいオブジェクトを作成するたびに、各オブジェクトにはインスタンスの独自のコピー、つまり非静的フィールドがあります
また、オブジェクト 1 と同じクラスを参照する 2 番目のオブジェクトは、オブジェクト 1 の static フィールドとは異なる値を持つことができますか?
ご質問の意味がよくわかりませんでしたが、
- object1 と object2 がクラスのインスタンスである場合、object1 がクラスの static フィールドを変更すると、object2 は更新された値を取得します。
インスタンス属性はインスタンスに固有のものであり、その値は同じクラスの他のインスタンス間で共有されません。
一方、クラス(またはstatic ) 属性は、特定のインスタンスではなくクラスに属しているため、クラスのすべてのインスタンスに共通の属性です。
そのため、静的属性には注意が必要です。1 つの変更が、それを使用するすべてのコードに反映され、予期しない結果が生じる場合があるためです。実際には、定数の不変の値を持つ場合を除いて、静的属性を避ける傾向があります。
同様の考慮事項がインスタンス メソッドと静的メソッドにも当てはまります。インスタンス メソッドはインスタンス メソッドと静的メソッドおよび属性の両方を「参照」できますが、静的メソッドはクラスの静的メソッドと属性のみを参照でき、インスタンスを「参照」することはできません。メソッドと属性 (つまり、オブジェクトをインスタンス化し、それを使用してそのインスタンス メンバーにアクセスする場合を除きます)。
種類...静的オブジェクトはクラスのインスタンス間で共有され、非静的オブジェクトはインスタンスに固有です。メソッドについても同様です。
フィールドが静的であると宣言されている場合、クラスのインスタンスが最終的にいくつ (場合によってはゼロ) 作成されるかに関係なく、フィールドの具体化は 1 つだけ存在します。クラス変数と呼ばれることもある static フィールドは、クラスが初期化されるときに具体化されます (§12.4)。
JLS §8.3.1.1を参照してください。
フィールドが宣言されている場合、
static
最終的に作成されるクラスのインスタンスの数 (場合によってはゼロ) に関係なく、フィールドの具体化は 1 つだけ存在します。クラス変数と呼ばれることもある static フィールドは、クラスが初期化されるときに生成されます ( §12.4 )。
対照的に、クラスの各インスタンスには、非静的フィールドの固有の値が含まれています。クラスがインスタンス化されると、非静的フィールドが具体化されます。
宣言されていないフィールド
static
(非static
フィールドと呼ばれることもあります) は、インスタンス変数と呼ばれます。クラスの新しいインスタンスが作成されるたびに ( §12.5 )、そのインスタンスに関連付けられた新しい変数が、そのクラスまたはそのスーパークラスで宣言されたすべてのインスタンス変数に対して作成されます。