Javaのstatic変数とブランクfinal変数の違いを解説!初期化方法とサンプルコード
静的変数(static変数)とは
静的変数は「static」キーワードを使って宣言される変数で、「クラス変数」とも呼ばれます。クラスのメソッドの外側で定義され、変数がstaticとして宣言されると、生成されるオブジェクトの数に関係なく、そのクラスのすべてのオブジェクト間で値が共有されるのが特徴です。
staticキーワードを変数に使用した場合の動作を示す例
コード例
public class Demo{
String name;
static String designation;
public void display_data(){
System.out.println("The name is: " + name);
System.out.println("The designation of this team members is : " + designation);
}
public static void main(String s[]){
Demo.designation = "Intern";
Demo my_obj = new Demo();
my_obj.name = "Joe";
Demo my_obj_2 = new Demo();
my_obj_2.name = "Joanna";
my_obj.display_data();
my_obj_2.display_data();
my_obj.designation = "Senior dev";
System.out.println("\nAfter the changes, the data is :\n");
my_obj.display_data();
my_obj_2.display_data();
}
}実行結果
The name is: Joe The designation of this team members is : Intern The name is: Joanna The designation of this team members is : Intern After the changes, the data is : The name is: Joe The designation of this team members is : Senior dev The name is: Joanna The designation of this team members is : Senior dev
この例では、Demoというクラスに変数と、クラス変数を表示するためのdisplay_dataメソッドが定義されています。mainメソッドでは、まずクラスのインスタンスを生成してnameフィールドに名前を設定し、表示を行っています。その後、別のインスタンスを生成して同様の処理を実行します。最後に一方のオブジェクト経由でdesignationの値を変更すると、もう一方のオブジェクトにも同じ変更が反映されていることが出力から確認できます。これは、static変数がすべてのインスタンスで共有されていることを示す好例です。
ブランクfinal変数とは
ブランクfinal変数とは、その名の通り、宣言時に値が代入されていないfinal変数のことです。この変数はコンストラクタ内でのみ初期化可能であり、初期化しないままにしておくとコンパイルエラーが発生します。
static finalブランク変数とは
static finalブランク変数は、ブランクfinal変数の定義に「static」キーワードを組み合わせたものです。この場合、staticブロック(静的初期化ブロック)内でのみ初期化できるというルールになります。
コード例
public class Demo{
private static final int val_1;
private final int val_2;
static{ val_1 = 1;
}
Demo(int val_3){
val_2 = val_3;
}
public static void main(String s[]){
Demo obj_1 = new Demo(95);
Demo obj_2 = new Demo(99);
System.out.println("The value of first variable is : ");
System.out.println(Demo.val_1);
System.out.println("The value of first variable accessed using the object : ");
System.out.println(obj_1.val_2);
}
}実行結果
The value of first variable is : 1 The value of first variable accessed using the object : 95
この例では、Demoクラスにstatic finalなブランク変数val_1と、finalなブランク変数val_2が宣言されています。val_1はstaticブロック内で初期化され、val_2は引数を受け取るコンストラクタ内で初期化されます。mainメソッドでは2つのインスタンスを生成し、それぞれの値をコンソールに出力しています。val_1がクラス全体で共有される単一の値であるのに対し、val_2はインスタンスごとに異なる値を持てることがポイントです。
-
Javaでブランクfinal変数(空白final変数)は初期化できる?
結論:はい、初期化できます Javaでは、宣言時に値を代入しない「ブランクfinal変数(空白final変数)」を作成することができます。ただし、final変数である以上、使用する前に必ず一度だけ初期化しなければなりません。 この初期化は、次のいずれかの場所で行うことができます。 コンストラクタ インスタンス初期化ブロック 1. コンストラクタで初期化する方法 最も一般的なのは、コンストラクタ内で値を代入する方法です。オブジェクト生成時に引数として渡した値を、final変数に設定できます。 public class Sample { // ブランクfinal変数(宣言時には初期化
-
Javaのfinal変数とは?使い方と定数宣言の基本を解説
Javaにおけるfinal変数は、明示的な初期化を一度しか行えない変数です。一度値を代入すると、その後は再代入することができません。 また、参照型変数にfinalを付けた場合、その参照先のオブジェクトを別のオブジェクトに変更することはできません。ただし、オブジェクト内部のデータ(フィールドの値など)は変更可能です。つまり、オブジェクトの状態は変更できるが、参照自体は変更できないという点に注意が必要です。 final修飾子とstaticの組み合わせ 変数に対してfinal修飾子を使用する場合、多くの場面でstaticキーワードと組み合わせて使われます。これにより、定数がクラス変数(クラス全体で共