Java 変数型

Java 言語では、すべての変数は使用前に宣言しなければなりません。

変数を宣言する基本的な形式は次のとおりです:

type identifier [ = value][, identifier [= value] ...] ;

形式の説明:

  • type -- データ型。
  • identifier -- 変数名です。カンマを使用して,区切ることで、複数の同型変数を宣言できます。

以下に、いくつかの変数の宣言例を示します。一部に初期化プロセスが含まれていることに注意してください。

int a, b, c;         //3つのint型整数を宣言:a、b、c int d = 3, e = 4, f = 5; //3つの整数を宣言し、初期値を与える byte z = 22;         //zを宣言して初期化 String s = "サンプル"; //文字列 s を宣言して初期化 double pi = 3.14159; //倍精度浮動小数点型変数 pi を宣言 char x = 'x';        //変数 x の値が文字 'x' であることを宣言

Java 言語がサポートする変数型は次のとおりです:

  • ローカル変数(Local Variables):ローカル変数は、メソッド、コンストラクタ、またはブロック内で宣言される変数です。これらは宣言されたメソッド、コンストラクタ、またはブロックの実行が終了すると破棄されます。ローカル変数は宣言時に初期化する必要があり、初期化しないとコンパイルエラーになります。

    public void exampleMethod() {
        int localVar = 10; // 局部变量
        // ...
    }
  • インスタンス変数(Instance Variables):インスタンス変数はクラス内で宣言されますが、メソッド、コンストラクタ、またはブロックの外にあります。これらはクラスのインスタンスに属し、クラスの各インスタンスは独自のコピーを持ちます。明示的に初期化しない場合、インスタンス変数にはデフォルト値(数値型は0、boolean型はfalse、オブジェクト参照型はnull)が与えられます。

    public class ExampleClass {
        int instanceVar; // 实例变量
    }
  • 静的変数またはクラス変数(Class Variables):クラス変数は、クラス内で static キーワードを使用して宣言される変数です。これらはクラスに属し、インスタンスには属しません。そのクラスのすべてのインスタンスは同じクラス変数の値を共有します。クラス変数はクラスのロード時に初期化され、初期化は一度だけです。

    public class ExampleClass {
        static int classVar; // 类变量
    }
  • パラメータ変数(Parameters):パラメータは、メソッドまたはコンストラクタの宣言内の変数であり、そのメソッドまたはコンストラクタを呼び出す際に渡される値を受け取るために使用されます。パラメータ変数のスコープはメソッド内部に限られます。

    public void exampleMethod(int parameterVar) {
        // 参数变量
        // ...
    }

次の例では、メンバー変数 instanceVar と静的変数 staticVar を含む サンプルTest クラスを定義しています。

method() メソッド内では、パラメータ変数 paramVar とローカル変数 localVar を定義しています。メソッド内部で、ローカル変数の値をメンバー変数に代入し、パラメータ変数の値を静的変数に代入してから、これらの変数の値を出力します。

main() メソッド内では、サンプルTest オブジェクトを作成し、その method() メソッドを呼び出しています。

例

public class サンプルTest { //メンバー変数 private int instanceVar; //静的変数 private static int staticVar; public void method(int paramVar) { //ローカル変数 int localVar = 10; //変数の使用 instanceVar = localVar; staticVar = paramVar; System.out.println("メンバー変数:" + instanceVar); System.out.println("静的変数:" + staticVar); System.out.println("パラメータ変数:" + paramVar); System.out.println("ローカル変数:" + localVar); } public static void main(String[] args) { サンプルTest v = new サンプルTest(); v.method(20); } }

上記のコードを実行すると、出力は次のとおりです:

成员变量: 10
静态变量: 20
参数变量: 20
局部变量: 10

Java パラメータ変数

Java のパラメータ変数とは、メソッドまたはコンストラクタで宣言される変数のことで、メソッドまたはコンストラクタに渡される値を受け取るために使用されます。パラメータ変数はローカル変数に似ていますが、メソッドまたはコンストラクタが呼び出されている間だけ存在し、メソッドまたはコンストラクタ内部でのみ使用できます。

Java メソッドの宣言構文は次のとおりです:

accessModifier returnType methodName(parameterType parameterName1, parameterType parameterName2, ...) {
    // 方法体
}
  • parameterType -- パラメータ変数の型を表します。
  • parameterName -- パラメータ変数の名前を表します。

メソッドを呼び出す際には、パラメータ変数に値を渡す必要があります。これらの値は、定数、変数、または式にすることができます。

メソッドのパラメータ変数の値の渡し方には2つの種類があります:値渡しと参照渡し。

  • 値渡し:メソッド呼び出し時、渡されるのは実際のパラメータの値のコピーです。パラメータ変数に新しい値が代入されると、コピーの値だけが変更され、元の値には影響しません。Java の基本データ型はすべて値渡し方式でパラメータ変数の値を渡します。

  • 参照渡し:メソッド呼び出し時、渡されるのは実際のパラメータの参照(すなわちメモリアドレス)です。パラメータ変数に新しい値が代入されると、元の値の内容が変更されます。Java のオブジェクト型は参照渡し方式でパラメータ変数の値を渡します。

以下は、メソッドのパラメータ変数の使用を示す簡単な例です:

例

public class サンプルTest {
    public static void main(String[] args) {
        int a = 10, b = 20;
        swap(a, b); // swapメソッドを呼び出す
        System.out.println("a = " + a + ", b = " + b); // aとbの値を出力する
    }
   
    public static void swap(int x, int y) {
        int temp = x;
        x = y;
        y = temp;
    }
}

上記のコードを実行すると、出力は次のとおりです:

a = 10, b = 20

Java ローカル変数

Java のローカル変数は、メソッド、コンストラクタ、または文ブロック内で宣言される変数であり、そのスコープは宣言されたコードブロック内に限定されます。

ローカル変数の宣言構文は次のとおりです:

type variableName;
  • type -- 変数の型を表します。
  • variableName -- 変数の名前を表します。

説明:

  • スコープ:ローカル変数のスコープは、宣言されたメソッド、コンストラクタ、またはコードブロック内に限定されます。コードの実行フローがこのスコープを離れると、ローカル変数はアクセスできなくなります。

  • ライフサイクル:ローカル変数のライフサイクルは宣言時から始まり、メソッド、コンストラクタ、またはコードブロックの実行が終了すると終了します。その後、ローカル変数はガベージコレクションの対象になります。

  • 初期化:ローカル変数は使用前に初期化する必要があります。初期化しない場合、コンパイラはエラーを報告します。Java はローカル変数にデフォルト値を提供しないためです。

  • 宣言:ローカル変数の宣言は、メソッドまたはコードブロックの先頭で行う必要があります。宣言時にはデータ型を指定し、その後に変数名を続けます。例:int count;。

  • 代入:ローカル変数は宣言後、メソッド内で使用する前に必ず代入されなければなりません。代入は直接代入でも、メソッド呼び出しや式による代入でもかまいません。

  • 制限:ローカル変数はクラスの他のメソッドから直接アクセスできません。これらは宣言したメソッドまたはコードブロックだけにプライベートです。

  • メモリ管理:ローカル変数は Java 仮想マシン(JVM)のスタックに格納され、ヒープに格納されるインスタンス変数やオブジェクトとは異なります。

  • ガベージコレクション:ローカル変数のライフサイクルはメソッドまたはコードブロックの実行に厳密に限定されているため、メソッドまたはコードブロックの実行完了後は参照されなくなります。そのため、JVMのガベージコレクタがこれらの占有メモリを自動的に回収します。

  • 再利用:ローカル変数の名前は、異なるメソッドまたはコードブロック内で再利用できます。それらのスコープはローカルであり、名前の衝突を引き起こさないためです。

  • パラメータと戻り値:メソッドのパラメータは特別なローカル変数と見なすことができます。これらはメソッド呼び出し時に初期化され、メソッドが戻るとライフサイクルが終了します。

例

以下は、ローカル変数の使用を示す簡単な例です:

例

public class LocalVariablesExample {
    public static void main(String[] args) {
        int a = 10; // ローカル変数aの宣言と初期化
        int b;     // ローカル変数bの宣言
        b = 20;    // ローカル変数bの初期化
       
        System.out.println("a = " + a);
        System.out.println("b = " + b);
       
        // 使用前にローカル変数を初期化しない場合、コンパイラはエラーを報告します
        // int c;
        // System.out.println("c = " + c);
    }
}

上記の例では、2つのローカル変数 a と b を宣言して初期化し、それらの値を出力しています。ローカル変数を使用する前に初期化しないと、コンパイラがエラーを報告することに注意してください。

次の例では、age はローカル変数で、pupAge() メソッド内で定義されており、そのスコープはこのメソッド内に限定されています:

package com.サンプル.test; public class Test{ public void pupAge(){ int age = 0; age = age + 7; System.out.println("子犬の年齢は:" + age); } public static void main(String[] args){ Test test = new Test(); test.pupAge(); } }

上記の例をコンパイルして実行した結果は次のとおりです:

小狗的年龄是: 7

次の例では、age 変数が初期化されていないため、コンパイル時にエラーが発生します:

package com.サンプル.test; public class Test{ public void pupAge(){ int age; age = age + 7; System.out.println("子犬の年齢は:" + age); } public static void main(String[] args){ Test test = new Test(); test.pupAge(); } }

上記の例をコンパイルして実行した結果は次のとおりです:

Test.java:4:variable number might not have been initialized
age = age + 7;
         ^
1 error

メンバー変数(インスタンス変数)

  • メンバー変数はクラス内で宣言されますが、メソッド、コンストラクタ、および文ブロックの外にあります。
  • オブジェクトがインスタンス化されると、各メンバー変数の値が確定します。
  • メンバー変数はオブジェクトの作成時に作成され、オブジェクトが破棄されるときに破棄されます。
  • メンバー変数の値は、少なくとも1つのメソッド、コンストラクタ、または文ブロックによって参照されるべきであり、外部がこれらの方法でインスタンス変数の情報を取得できるようにします。
  • メンバー変数は使用前または使用後に宣言できます。
  • アクセス修飾子はメンバー変数を修飾できます。
  • メンバー変数は、クラス内のメソッド、コンストラクタ、または文ブロックから参照可能です。一般的にはメンバー変数をプライベートに設定すべきです。アクセス修飾子を使用することで、メンバー変数をサブクラスから参照可能にできます。
  • メンバー変数にはデフォルト値があります。数値型変数のデフォルト値は0、ブール型変数のデフォルト値はfalse、参照型変数のデフォルト値はnullです。変数の値は宣言時に指定することも、コンストラクタ内で指定することもできます。
  • メンバー変数は変数名で直接アクセスできます。ただし、静的メソッドや他のクラスでは、完全修飾名を使用する必要があります。ObjectReference.VariableName。

メンバー変数の宣言構文は次のとおりです。

accessModifier type variableName;
  • accessModifier -- アクセス修飾子を示します。public、protected、private、またはデフォルトのアクセスレベル(アクセス修飾子を明示的に指定しない場合)を使用できます。
  • type -- 変数の型を示します。
  • variableName -- 変数の名前を示します。

ローカル変数とは異なり、メンバー変数の値はオブジェクト作成時に割り当てられ、初期化されていなくてもデフォルト値が与えられます。例えば、int 型の変数のデフォルト値は0、boolean 型の変数のデフォルト値はfalseです。

メンバー変数は、オブジェクトを介してアクセスすることも、クラス名を介してアクセスすることもできます(静的メンバー変数の場合)。メンバー変数が明示的に初期化されていない場合は、デフォルト値が与えられます。コンストラクタや他のメソッドでメンバー変数を初期化したり、オブジェクトやクラス名を介してアクセスして値を設定したりできます。

例

次の例では、2つのメンバー変数 a と b を宣言し、それらにアクセスして値を設定しています。メンバー変数にはオブジェクトを介してアクセスでき、静的メンバー変数にはクラス名を介してアクセスできることに注意してください。

例

public class サンプルTest {
      private int a; // プライベートメンバー変数a
      public String b = "Hello"; // パブリックメンバー変数b
     
      public static void main(String[] args) {
         サンプルTest obj = new サンプルTest(); // オブジェクトを作成
         
          obj.a = 10; // メンバー変数aにアクセスし、その値を10に設定
          System.out.println("a = " + obj.a);
         
          obj.b = "World"; // メンバー変数bにアクセスし、その値を"World"に設定
          System.out.println("b = " + obj.b);
      }
  }

上記の例をコンパイルして実行した結果は次のとおりです。

a = 10
b = World

次の例では、2つのメンバー変数 name と salary を宣言し、それらにアクセスして値を設定しています。

Employee.java ファイルコード:

import java.io.*; public class Employee{ //このメンバー変数はサブクラスから参照可能です public String name; //プライベート変数。このクラス内でのみ参照可能です private double salary; //コンストラクタでnameに値を代入します public Employee (String empName){ name = empName; } //salaryの値を設定します public void setSalary(double empSal){ salary = empSal; } //情報を出力します public void printEmp(){ System.out.println("名前 :" + name ); System.out.println("給与 :" + salary); } public static void main(String[] args){ Employee empOne = new Employee("サンプル"); empOne.setSalary(1000.0); empOne.printEmp(); } }

上記の例をコンパイルして実行した結果は次のとおりです。

$ javac Employee.java 
$ java Employee
名字 : サンプル
薪水 : 1000.0

クラス変数(静的変数)

Java の静的変数とは、クラス内で定義される変数であり、インスタンスではなくクラスに関連付けられます。つまり、クラスのインスタンスをいくつ作成しても、静的変数はメモリ内に1つのコピーしかなく、すべてのインスタンスで共有されます。

静的変数はクラスのロード時に作成され、プログラムの実行中ずっと存在します。

定義方法

静的変数の定義方法は、クラス内でstaticキーワードを使用して変数を修飾します。通常、クラス変数とも呼ばれます。

次の例では、静的変数を定義します。countその初期値は0です:

例

public class MyClass {
    public static int count = 0;
    // その他のメンバー変数とメソッド
}

アクセス方法

静的変数はクラスに関連付けられているため、クラス名を介して静的変数にアクセスすることも、インスタンス名を介してアクセスすることもできます。

例

MyClass.count = 10; // クラス名を介してアクセス
MyClass obj = new MyClass();
obj.count = 20; // インスタンス名を介してアクセス

ライフサイクル

静的変数のライフサイクルはプログラムのライフサイクルと同じ長さです。つまり、クラスのロード時に作成され、プログラムの実行中ずっと存在し、プログラムが終了するまで破棄されません。したがって、静的変数は設定情報やグローバル変数など、プログラム全体で使用する必要があるデータを格納するために使用できます。

初期化タイミング

静的変数はクラスのロード時に初期化され、その初期化順序は定義順序に関係します。

ある静的変数が別の静的変数に依存する場合、その静的変数は後で定義する必要があります。

例

public class MyClass {
    public static int count1 = 0;
    public static int count2 = count1 + 1;
    // その他のメンバー変数とメソッド
}

上記の例では、count1 は count2 より先に初期化する必要があります。そうしないと、コンパイル時にエラーが発生します。

定数と静的変数の違い

定数もクラスに関連付けられますが、final キーワードで修飾された変数であり、一度値を代入すると変更できません。静的変数とは異なり、定数はコンパイル時にその値が決定されますが、静的変数の値は実行時に変更できます。また、定数は数学定数や設定情報などの固定値を格納するために使用されることが一般的ですが、静的変数はカウンタやグローバル状態などの可変データを格納するために使用されます。

要するに、静的変数はクラスに関連付けられた変数であり、一意性と共有性を持ち、プログラム全体で使用する必要があるデータを格納できますが、初期化のタイミングと定数との違いに注意する必要があります。

静的変数のアクセス修飾子

静的変数のアクセス修飾子は、public、protected、private、またはデフォルトのアクセス修飾子(アクセス修飾子を書かない)にすることができます。

静的変数のアクセス権限はインスタンス変数とは異なることに注意が必要です。静的変数はクラスに関連付けられており、いかなるインスタンスにも依存しないためです。

静的変数のスレッドセーフティ

Java の静的変数はクラスに属し、オブジェクトのインスタンスには属しません。したがって、複数のスレッドが同時に静的変数を含むクラスにアクセスする場合、そのスレッドセーフティを考慮する必要があります。

静的変数はメモリ内に1つのコピーしかなく、すべてのインスタンスで共有されます。したがって、あるスレッドが静的変数の値を変更すると、他のスレッドがその静的変数にアクセスしたときにも変更後の値が表示されます。複数のスレッドが同時に静的変数を変更する可能性があるため、不確定な結果やデータの整合性の問題が発生する可能性があり、これにより並行アクセスの問題が発生する可能性があります。

静的変数のスレッドセーフティを確保するには、同期メカニズム、アトミッククラス、volatileキーワードなどの適切な同期措置を講じて、マルチスレッド環境で静的変数の値を正しく読み取りおよび変更できるようにする必要があります。

静的変数の命名規則

静的変数(クラス変数とも呼ばれる)の命名規則は、通常キャメルケースに従うが、通常はすべて大文字を使用し、単語間はアンダースコアで区切り、static キーワードで明確に識別する。

  • キャメルケースを使用する:静的変数の命名はキャメルケースを使用すべきです。つまり、最初の文字は小文字で、後続の各単語の最初の文字は大文字にします。例:myStaticVariable。

  • すべて大文字:静的変数は通常、すべて大文字を使用し、単語間はアンダースコアで区切ります。これは「アッパースネークケース」(Upper Snake Case)と呼ばれます。例:MY_STATIC_VARIABLE。

  • 説明的であること:変数名は意味があり、その変数の用途を明確に表現できるものであるべきです。単一の文字や明確な意味を持たない略語の使用は避けてください。

  • 略語の使用を避ける:コードの可読性を高めるため、略語の使用はできるだけ避けてください。略語の使用がどうしても必要な場合は、広く理解されていることを確認し、コメントで説明してください。

例

public class MyClass {
    // キャメルケースを使用
    public static int myStaticVariable;

    // アッパースネークケースを使用
    public static final int MAX_SIZE = 100;

    // 略語の使用を避ける
    public static final String employeeName;

    // 説明的な変数名
    public static double defaultInterestRate;
}

静的変数の使用シーン

静的変数は通常、以下の場面で使用されます:

  • グローバル状態または設定情報の格納
  • カウンタまたは統計情報
  • キャッシュデータまたは共有リソース
  • ユーティリティクラスの定数またはメソッド
  • シングルトンパターンにおけるインスタンス変数

例

次の例では、AppConfig クラスを定義しています。このクラスには、アプリケーションの名前、バージョン、データベース接続URLを格納するための3つの静的変数 APP_NAME、APP_VERSION、DATABASE_URL が含まれています。これらの変数はすべて final として宣言されており、変更不可能な定数であることを示しています。

main() メソッド内で、これらの静的変数の値を出力しています。

AppConfig.java ファイルコード:

public class AppConfig { public static final String APP_NAME = "MyApp"; public static final String APP_VERSION = "1.0.0"; public static final String DATABASE_URL = "jdbc:mysql://localhost:3306/mydb"; public static void main(String[] args) { System.out.println("Application name: " + AppConfig.APP_NAME); System.out.println("Application version: " + AppConfig.APP_VERSION); System.out.println("Database URL: " + AppConfig.DATABASE_URL); } }

上記の例をコンパイルして実行した結果は次のとおりです。

Application name: MyApp
Application version: 1.0.0
Database URL: jdbc:mysql://localhost:3306/mydb

これらの静的変数が格納するグローバル設定情報は、プログラム全体で使用でき、変更されないことがわかります。この例は、静的変数のもう1つの一般的な用途を示しています。これにより、グローバル設定情報を簡単に格納したり、グローバルに共有する必要があるその他のデータを実装したりできます。

次の例では、Counter クラスを定義しています。このクラスには、作成された Counter オブジェクトの数を記録するための静的変数 count が含まれています。

新しいオブジェクトが作成されるたびに、コンストラクタがカウンタを1増やします。静的メソッド getCount() は現在のカウンタの値を取得するために使用されます。

main() メソッド内で、3つの Counter オブジェクトを作成し、カウンタの値を出力しています。

Counter.java ファイルコード:

public class Counter { private static int count = 0; public Counter() { count++; } public static int getCount() { return count; } public static void main(String[] args) { Counter c1 = new Counter(); Counter c2 = new Counter(); Counter c3 = new Counter(); System.out.println("これまでに作成されたオブジェクトの数:" + Counter.getCount()); } }

上記の例をコンパイルして実行した結果は次のとおりです。

目前为止创建的对象数: 3

見てわかるように、カウンタは3つのオブジェクトが作成されたことを記録しています。この例は静的変数の簡単な応用を示しており、これを通じてオブジェクトの作成回数を簡単にカウントしたり、他のグローバルに共有する必要があるデータを記録したりできます。

この章ではJavaの変数型について学びました。次の章ではJava修飾子の使用について紹介します。

その他の拡張