1. 静的変数
クラスがメモリにロードされると、静的オブジェクトがただちに作成されます。このオブジェクトには、静的クラス変数 (静的クラス フィールド) が格納されます。静的オブジェクトは、クラスの通常の (非静的) オブジェクトが作成されていない場合でも存在します。
クラスで変数を宣言するときは、変数を 1 回だけ作成するか、各オブジェクトにこれらの変数の個別のインスタンスが存在する必要があるかを指定します。デフォルトでは、各変数の新しいコピーがオブジェクトごとに作成されます。
静的変数はクラスの静的オブジェクトにバインドされており、そのインスタンスは常に 1 つだけ存在します。
クラス内に静的変数を作成するには、static
その名前の前にキーワードを記述する必要があります。静的変数を宣言する一般的な形式は次のとおりです。
static Type name = value;
静的変数に初期値が割り当てられていない場合は、デフォルト値で初期化されます。
タイプ | デフォルト値 |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
(と同じこと
) |
|
|
そしてどのクラスでも |
|
例:
コード | ノート |
---|---|
|
|
|
|
|
|
|
|
|
クラス内では、名前を使用するだけでその静的変数を参照できます。ただし、別のクラスからアクセスするには、静的変数の名前の前にクラスの名前を記述する必要があります。
ClassName.variable
例:
変数 | クラス | クラス外の変数へのアクセス |
---|---|---|
|
|
|
|
|
|
|
|
変数は ですprivate 。クラス外では見えません。 |
|
|
変数は ですprivate 。クラス外では見えません。 |
|
|
変数は ですprivate 。クラス外では見えません。 |
2. 静的変数と非静的変数の違い
クラスの非静的 (通常の) 変数は、キーワードを使用しない点のみを除き、静的変数と同じ方法で宣言されますstatic
。
通常の変数と静的変数の違いは何ですか?
クラスの通常の変数はクラスのオブジェクト (クラスのインスタンス) にバインドされますが、静的変数はクラスの静的オブジェクトにバインドされます。
クラスに複数のインスタンスがある場合、それぞれのインスタンスには非静的 (通常の) 変数の独自のコピーがあります。クラスの静的変数は常にその静的オブジェクトに格納され、そのインスタンスは 1 つだけ存在します。
クラスのオブジェクトへの参照がある場合にのみ、クラスの通常の変数 (フィールド) にアクセスできます。もちろん、クラスのメソッド内でもです。
例:
オブジェクト参照を使用したクラスのフィールドへのアクセス |
---|
|
静的変数には、通常のメソッド、同じクラスの静的メソッド、他のクラスのメソッドなど、どこからでも (可視性修飾子を考慮した上で) アクセスできます。
例:
オブジェクト参照を使用せずにクラスの静的フィールドにアクセスする |
---|
|
メモリはどのように構成されているか:
4 つのフィールドを持つクラスがあるとしますPerson
。2 つは静的で、2 つは静的ではありません。
public class Person
{
public static int count = 0;
public static int sum = 0;
public int age = 0;
public String name;
}
クラスをロードした直後
Java マシンがPerson
クラスのロードを完了すると、メモリは次のようになります。
最初のオブジェクトを作成した後
オブジェクトを作成するとPerson
、次のような図になります。
どちらのオブジェクトにも 2 つの変数がありますが、これらは異なる変数であることに注意してください。通常のオブジェクトには通常の変数があり、静的オブジェクトには静的変数があります。
もっとオブジェクトが必要です
さらに 2 つのオブジェクトを作成しましょうPerson
。これでメモリは次のようになります。
各オブジェクトには独自の年齢変数と名前変数があることに注意してください。
3.static
モディファイアの削除と追加
静的なものから普通のものへ
静的変数を取得し、その修飾子を削除して通常のstatic
変数に変えるとどうなるでしょうか? たとえば、static int sum
変数です。
変更されたコードは次のようになります。
public class Person
{
public static int count = 0;
public int sum = 0;
public int age = 0;
public String name;
}
これでメモリは次のようになります。
静的変数は静的オブジェクトから消え、通常の各オブジェクトが独自のsum
変数を持つようになりました。
普通のものから静的なものへ
逆に、static
クラスの通常の変数に修飾子を追加することもできます。それらはすべての通常のオブジェクトから消え、静的なオブジェクトに表示されます。変数と変数を静的にすることにしたとします。age
name
すると、コードは次のようになります。
public class Person
{
public static int count = 0;
public int sum = 0;
public static int age = 0;
public static String name;
}
そしてメモリは次のようになります。
GO TO FULL VERSION