3.

Java 変数宣言完全ガイド (var/型推論/final/スコープ)

編集
この記事の要点
  • Java の変数宣言は 型を先頭 に書く: int n = 10; / String s = "hello";
  • Java 10+ では var によるローカル変数型推論が利用可能(var n = 10;
  • final 修飾子で再代入不可(PHP の readonly や Kotlin の val に相当)
  • PHP の $var = 10; と違い、型を明示 し、初期化していないローカル変数は使えない
  • スコープは ブロック / メソッド / クラス の 3 階層。フィールドはデフォルト値 (0 / null / false) を持つ

Java の変数宣言の基本

Java では変数を使う前に 必ず型と名前を宣言します。PHP や JavaScript と違い、型を省略するとコンパイルエラーになります。

// 型 変数名 = 初期値;
int     count = 10;
double  price = 99.99;
boolean flag  = true;
char    c     = 'A';
String  name  = "Taro";   // 参照型 (クラス)

// 初期化せず宣言だけも可能
int total;
total = 100;              // 後で代入

// 同じ型の変数を複数宣言
int a = 1, b = 2, c2 = 3;

プリミティブ型と参照型

分類サイズデフォルト値
整数byte8 bit0
short16 bit0
int32 bit0
long64 bit0L
浮動小数float32 bit0.0f
double64 bit0.0d
論理booleanJVM 依存false
文字char16 bit''
参照String / 配列 / クラス4 or 8 bytenull

Java 10+ の var (型推論)

Java 10 で導入された Local Variable Type Inference。右辺から型を推論します:

// 従来の書き方
ArrayList<Map<String, Integer>> data = new ArrayList<Map<String, Integer>>();

// var で簡潔に
var data = new ArrayList<Map<String, Integer>>();

var n     = 10;            // int と推論
var s     = "hello";       // String
var list  = List.of(1, 2); // List<Integer>

// ❌ NG: 右辺から推論できない場合
var x;                     // コンパイルエラー (初期化必須)
var y = null;              // エラー (型決定不能)

// ❌ NG: メソッドの引数やフィールドには使えない
// public void foo(var x) {} ← コンパイルエラー
// class C { var field; }    ← コンパイルエラー

var はあくまで構文糖衣で、コンパイル時に型が確定します。動的型付けではありません。

final 修飾子(再代入不可)

final int MAX = 100;
MAX = 200;          // ❌ コンパイルエラー

// オブジェクトの場合は「参照の再代入」ができないだけ
final List<Integer> list = new ArrayList<>();
list.add(1);        // ✅ OK (中身は変更可)
list = new ArrayList<>();  // ❌ NG

// メソッド引数の final
public int sum(final int a, final int b) {
    // a = 10;       // ❌ NG
    return a + b;
}

// クラスフィールドの final (定数)
public class Config {
    public static final String VERSION = "1.0";
}

スコープ(有効範囲)

public class ScopeDemo {
    // クラススコープ (フィールド)
    private int field = 1;
    private static int CLASS_VAR = 100;

    public void method() {
        // メソッドスコープ
        int local = 10;

        if (local > 5) {
            // ブロックスコープ
            int inner = 20;
            System.out.println(local + inner);
        }
        // ここで inner は参照不可
        // System.out.println(inner); ← コンパイルエラー
    }
}

命名規則(Java の慣習)

対象規則
ローカル変数 / フィールドcamelCaseuserName / totalCount
定数 (static final)UPPER_SNAKE_CASEMAX_SIZE / API_KEY
クラス / インタフェースPascalCaseUserService
メソッドcamelCase (動詞始まり)getUserName()
パッケージ全小文字 (ドット区切り)com.example.app

初期化していない変数の扱い

Java は ローカル変数の自動初期化を行いません。未初期化のまま参照するとコンパイルエラーになります:

public void demo() {
    int x;
    System.out.println(x);  // ❌ variable x might not have been initialized
}

// 一方、フィールドは自動でデフォルト値が入る
public class Foo {
    int n;          // 0
    boolean b;      // false
    String s;       // null
}

PHP の変数宣言との違い

項目JavaPHP
型宣言必須 (var 除く)不要 (動的型付け)
変数の prefix無し$ 必須
未初期化参照コンパイルエラーWarning + null
再代入で型変更不可可 ($x = 1; $x = "a";)
const / 再代入禁止finalreadonly プロパティ / const

FAQ

Q: var はいつ使うべき?
A: 右辺の型が明らかな場合(new ArrayList<>() 等)に推奨。プリミティブや戻り値が不明瞭な API では従来通り型を明示するのが読みやすいです。

Q: final 引数は冗長では?
A: Java 8 のラムダ内で外側の変数を参照するとき、実質的 final(effectively final)である必要があります。明示的に final を付けると意図が伝わりやすくなります。

Q: 変数名にアンダースコアやドル記号は使える?
A: 構文上は OK ですが、$ は内部生成クラス用、_ は将来予約されているため使用非推奨です。

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. 記述方法
  2. コメント
  3. 変数の宣言
  4. 関数
  5. 演算子
  6. 条件文
  7. 配列
  8. 連想配列
  9. ループ処理
  10. 非同期処理
  11. 同期処理
  12. 確認ウィンドウを表示する方法
  13. 文字の置換
  14. base urlを取得する方法
  15. formのsubmit前にjavascriptを呼び出す方法
  16. undefinedのイコール判定
  17. Javascript のみで form を post で submit する方法

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