3.

Java 変数完全ガイド(プリミティブ / 参照 / final / var / スコープ)

編集
この記事の要点
  • Java の変数はプリミティブ型(int/long/double 等 8 種)参照型(クラス / 配列)の 2 系統
  • 宣言と初期化: int x = 10;。インスタンス変数はデフォルト値あり、ローカル変数はデフォルト値なし(未初期化使用はコンパイルエラー)
  • スコープはブロック単位 { }。同名変数を内側で再宣言不可
  • var(Java 10+, JEP 286 LVTI)でローカル変数の型推論。インスタンス変数では使えない
  • final で定数化。static final がクラス定数(命名は SCREAMING_SNAKE_CASE

変数の基本

// 宣言 + 初期化
int x = 10;
String name = "taro";
double price = 1980.0;

// 宣言と初期化を分離
int y;
y = 20;

// 同じ型を複数同時に
int a = 1, b = 2, c = 3;

// 定数 (final)
final int MAX_COUNT = 100;
// MAX_COUNT = 200;  // ❌ コンパイルエラー

プリミティブ型 8 種

サイズ範囲デフォルト値
boolean1 bit (実装依存)true / falsefalse
byte8 bit-128 〜 1270
short16 bit-32768 〜 327670
char16 bit0 〜 65535 (UTF-16)''
int32 bit-2^31 〜 2^31-1(約 ±21億)0
long64 bit-2^63 〜 2^63-10L
float32 bitIEEE 754 単精度0.0f
double64 bitIEEE 754 倍精度0.0d

参照型とプリミティブの違い

// プリミティブ: 値そのものを変数が持つ
int a = 10;
int b = a;        // 値コピー
b = 20;
System.out.println(a);  // 10(a は影響なし)

// 参照型: ヒープのオブジェクトへの参照
int[] arr1 = {1, 2, 3};
int[] arr2 = arr1;     // 参照コピー(同じ配列を指す)
arr2[0] = 99;
System.out.println(arr1[0]);  // 99(同じ配列だから変わる)

// String は不変なので参照型でも値型のように振る舞う
String s1 = "hello";
String s2 = s1;
s2 = "world";
System.out.println(s1);  // hello

変数の種類とスコープ

public class User {
    // クラス変数 (static): クラスに 1 つ。デフォルト値あり
    static int totalUsers = 0;

    // インスタンス変数: インスタンスごと。デフォルト値あり
    private String name;
    private int age;

    // 静的定数
    public static final String DEFAULT_ROLE = "guest";

    public void process() {
        // ローカル変数: ブロック内のみ有効。デフォルト値なし
        int count = 0;

        for (int i = 0; i < 10; i++) {
            // for のループ変数 i はループブロック内のみ
            count += i;
        }
        // System.out.println(i);  // ❌ コンパイルエラー: i はここでは見えない

        if (count > 30) {
            String message = "high";  // if ブロック内のみ
        }
        // System.out.println(message);  // ❌ エラー
    }
}

var による型推論 (Java 10+, JEP 286)

// Java 10+ LVTI (Local Variable Type Inference)
var name = "taro";                    // String
var count = 10;                       // int
var list = new ArrayList<String>();   // ArrayList<String>
var map = Map.of("a", 1, "b", 2);     // Map<String, Integer>

// for ループでも使える
for (var entry : map.entrySet()) {
    System.out.println(entry.getKey() + ": " + entry.getValue());
}

// ❌ できないこと
// var x;                  // 初期化必須
// var y = null;           // 型推論不可
// var z = () -> 1;        // ラムダの型推論不可
// public var field = 10;  // フィールドでは不可
// var add(var x) {...}    // メソッドの引数 / 戻り値では不可

final 変数

// 1. ローカル変数の final
final int MAX = 100;
// MAX = 200;  // ❌ 再代入不可

// 2. インスタンス定数(コンストラクタで 1 度だけ代入可)
public class Order {
    private final String id;
    public Order(String id) {
        this.id = id;          // OK
    }
}

// 3. static final = 真の定数(クラス定数)
public class Constants {
    public static final int MAX_RETRY = 3;
    public static final String SERVICE_NAME = "OrderService";
}

// 4. 参照型の final: 参照は変えられないが中身は変えられる
final int[] arr = {1, 2, 3};
arr[0] = 99;        // OK
// arr = new int[5];  // ❌ 参照の付け替え不可

final List<String> list = new ArrayList<>();
list.add("hello");  // OK(List 自体は不変ではない)

命名規則

対象命名
クラスUpperCamelCaseOrderService
変数 / メソッドlowerCamelCaseuserName / getUserAge()
定数 (static final)SCREAMING_SNAKE_CASEMAX_RETRY_COUNT
パッケージlowercasecom.example.order
型パラメータ1 文字大文字T, E, K, V

Auto Boxing / Wrapper クラス

// プリミティブ ↔ Wrapper の自動変換
int i = 10;
Integer boxed = i;          // Auto Boxing: int → Integer
int unboxed = boxed;        // Auto Unboxing: Integer → int

// Generics は参照型のみ → Wrapper 必須
List<Integer> nums = new ArrayList<>();
nums.add(10);               // Auto Boxing

// 落とし穴: Integer の比較は equals
Integer a = 200;
Integer b = 200;
System.out.println(a == b);        // false(参照比較)
System.out.println(a.equals(b));   // true

Integer c = 100;
Integer d = 100;
System.out.println(c == d);        // true(-128〜127 は IntegerCache)

他言語との違い

項目JavaPHPJavaScript
変数宣言型必須 or var$ 接頭辞、型自由let / const / var
型チェック静的(コンパイル時)動的動的 (TypeScript で静的)
定数final / static finalconst / define()const
スコープブロック関数(PHP 7+ で if/for もブロック類似)let/const はブロック、var は関数
初期化必須ローカル変数のみ不要不要

FAQ

Q: var はいつ使うべき?
A: 初期化式で型が自明な場合(var list = new ArrayList<String>();)に推奨。可読性が下がる長い式や数値リテラルは型を明示するのが無難。

Q: ローカル変数のデフォルト値はなぜ無い?
A: 「未初期化のまま使うバグ」を防ぐため、コンパイルエラーで検出する設計です。インスタンス変数はオブジェクト生成時に初期化保証されます。

Q: intInteger、どちらを使うべき?
A: 高速 / null 不要なら int、null 表現や Collection 格納が必要なら Integer。DB null マッピングは Integer がよい。

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. 基本事項
  2. HTMLへの埋め込み
  3. 変数
  4. 可変変数
  5. 定数
  6. データ型
  7. キャスト
  8. エスケープ文字
  9. 配列
  10. 演算子
  11. 代入の際の注意点
  12. 条件分岐
  13. 繰り返し処理
  14. クラスとインスタンス
  15. コンストラクタ
  16. 関数
  17. スーパーグローバル変数
  18. スコープ
  19. staticについて
  20. yieldについて
  21. ファイルのアップロード方法
  22. DB接続方法
  23. SQL実行方法
  24. カプセル化の具体例
  25. 継承の構文
  26. オーバーライド
  27. ポリモーフィズム(多様性)の具体例
  28. 抽象クラス・メソッドの構文と具体例
  29. GET通信
  30. try catchで全てのエラーを拾う方法

最近更新/作成されたページ