1. 静的変数

クラスがメモリにロードされると、静的オブジェクトがただちに作成されます。このオブジェクトには、静的クラス変数 (静的クラス フィールド) が格納されます。静的オブジェクトは、クラスの通常の (非静的) オブジェクトが作成されていない場合でも存在します。

クラスで変数を宣言するときは、変数を 1 回だけ作成するか、各オブジェクトにこれらの変数の個別のインスタンスが存在する必要があるかを指定します。デフォルトでは、各変数の新しいコピーがオブジェクトごとに作成されます。

静的変数はクラスの静的オブジェクトにバインドされており、そのインスタンスは常に 1 つだけ存在します。

クラス内に静的変数を作成するには、staticその名前の前にキーワードを記述する必要があります。静的変数を宣言する一般的な形式は次のとおりです。

static Type name = value;

静的変数に初期値が割り当てられていない場合は、デフォルト値で初期化されます。

タイプ デフォルト値
byte
0
short
0
int
0
long
0
float
0.0
double
0.0
char
'\u0000'
(と同じこと
0
)
boolean
false
Object
そしてどのクラスでも
null

例:

コード ノート
public static int WIDTH = 100;
public static String message = "Hello";
private static Scanner console;
private static int count = 0;
private static boolean flag;

クラス内では、名前を使用するだけでその静的変数を参照できます。ただし、別のクラスからアクセスするには、静的変数の名前の前にクラスの名前を記述する必要があります。

ClassName.variable

例:

変数 クラス クラス外の変数へのアクセス
public static int WIDTH = 100;
Solution
Solution.WIDTH
public static String message = "Hello";
Main
Main.message
private static Scanner console;
JavaGame
変数は ですprivate。クラス外では見えません。
private static int count = 0;
Counter
変数は ですprivate。クラス外では見えません。
private static boolean flag;
Arithmetic
変数は ですprivate。クラス外では見えません。


2. 静的変数と非静的変数の違い

クラスの非静的 (通常の) 変数は、キーワードを使用しない点のみを除き、静的変数と同じ方法で宣言されますstatic

通常の変数と静的変数の違いは何ですか?

クラスの通常の変数はクラスのオブジェクト (クラスのインスタンス) にバインドされますが、静的変数はクラスの静的オブジェクトにバインドされます。

クラスに複数のインスタンスがある場合、それぞれのインスタンスには非静的 (通常の) 変数の独自のコピーがあります。クラスの静的変数は常にその静的オブジェクトに格納され、そのインスタンスは 1 つだけ存在します。

クラスのオブジェクトへの参照がある場合にのみ、クラスの通常の変数 (フィールド) にアクセスできます。もちろん、クラスのメソッド内でもです。

例:

オブジェクト参照を使用したクラスのフィールドへのアクセス
public class DataInfo
{
   public int value = 100;
}

public class Solution
{
   public static void main(String[] args)
   {
      DataInfo info = new DataInfo();
      System.out.println(info.value);
   }
}

静的変数には、通常のメソッド、同じクラスの静的メソッド、他のクラスのメソッドなど、どこからでも (可視性修飾子を考慮した上で) アクセスできます。

例:

オブジェクト参照を使用せずにクラスの静的フィールドにアクセスする
public class DataInfo
{
   public static int value = 100;
}

public class Solution
{
   public static void main(String[] args)
   {
      System.out.println(DataInfo.value);
   }
}

メモリはどのように構成されているか:

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 つの変数がありますが、これらは異なる変数であることに注意してください。通常のオブジェクトには通常の変数があり、静的オブジェクトには静的変数があります。

もっとオブジェクトが必要です

さらに 2 つのオブジェクトを作成しましょうPerson。これでメモリは次のようになります。

静的変数と非静的変数の違い 3

各オブジェクトには独自の年齢変数と名前変数があることに注意してください。



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クラスの通常の変数に修飾子を追加することもできます。それらはすべての通常のオブジェクトから消え、静的なオブジェクトに表示されます。変数と変数を静的にすることにしたとします。agenameすると、コードは次のようになります。

public class Person
{
   public static int count = 0;
   public int sum = 0;
   public static int age = 0;
   public static String name;
}

そしてメモリは次のようになります。

静的修飾子の削除と追加