この内容は古いバージョンです。最新バージョンを表示するには、戻るボタンを押してください。
バージョン:7
ページ更新者:guest
更新日時:2026-06-11 07:10:02

タイトル: 変数の宣言
SEOタイトル: 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 ですが、$ は内部生成クラス用、_ は将来予約されているため使用非推奨です。