変数宣言の基本
Javaの変数は「型 名称 = 初期値;」の形で宣言します。型は“何を入れる箱か”を決めるもの。プリミティブ型は値そのものを、参照型は“モノが置いてある場所(アドレス)”を持ちます。
// プリミティブ型(値そのもの)
int age = 20;
double price = 1999.5;
char grade = 'A';
boolean isMember = true;
// 参照型(場所への参照)
String name = "Tanaka"; // 文字列(参照型だがリテラルで簡単に作れる)
int[] scores = new int[3]; // 配列は new が必要
scores[0] = 80;
Person p = new Person("Sato"); // 自作クラスも参照型
Java- ローカル変数の初期化: メソッド内で宣言した変数は、使う前に必ず初期化が必要です。
- フィールドの初期値: クラスのフィールドは未代入でも型に応じたデフォルト値が入ります(例: int は 0、boolean は false、参照型は null)。
プリミティブ型一覧と選び方
| 型 | 代表的な用途 | おおまかなサイズ/特徴 | 典型的初期値の例 |
|---|---|---|---|
| byte | バイナリやIOでの小さい整数 | 8ビット | 0 |
| short | メモリ節約の整数(稀) | 16ビット | 0 |
| int | 一般的な整数 | 32ビット(最もよく使う) | 0 |
| long | 大きな整数(ID、時刻等) | 64ビット | 0L |
| float | 小数(厳密さ不要) | 32ビット単精度 | 0.0f |
| double | 小数(通常はこちらを使う) | 64ビット倍精度 | 0.0 |
| char | 文字(Unicode1文字) | 16ビット | ‘\u0000’ |
| boolean | 真偽値 | true/false(サイズ未規定) | false |
- 選び方の指針:
- 整数: まずは int。int で足りないほど大きい値なら long。サイズを厳密に制御したい場合のみ byte/short。
- 小数: 精度を重視するなら double。メモリや特定APIの都合でのみ float。
- 文字: 1文字なら char、複数文字は String。
- 真偽: 条件フラグは boolean 一択。
参照型の基本(String/配列/クラス)
参照型は「オブジェクトがある場所」を持ちます。複数の変数が同じオブジェクトを参照すると、片方の変更がもう片方からも“見える”ことがあります。
// String は参照型だが「不変」:中身は変更されず、新しい文字列が作られる
String a = "Hello";
String b = a;
b = "World";
System.out.println(a); // Hello(a は影響を受けない)
System.out.println(b); // World
// 配列は「可変」:要素を書き換えると、同じ配列を参照するすべてに影響
int[] arr1 = {1, 2};
int[] arr2 = arr1; // 同じ配列を参照
arr2[0] = 99;
System.out.println(arr1[0]); // 99(arr1 も変わって見える)
// クラスの参照
class Person {
String name;
Person(String name) { this.name = name; }
}
Person p1 = new Person("Sato");
Person p2 = p1; // 同じ Person を指す
p2.name = "Suzuki";
System.out.println(p1.name); // Suzuki
Java- null の扱い: 参照型の未初期化は null(何も指していない)。null に対してメソッドを呼ぶと NullPointerException。
- new の必要性: String のリテラルを除き、配列・自作クラス・多くの標準クラスは new で実体を作る。
初期化のコツと落とし穴
- ローカル vs フィールド:
- ローカル変数: 使う前に代入必須(未代入はコンパイルエラー)。
- フィールド: 自動的に初期値(プリミティブは 0 系、参照型は null)が入るが、必要ならコンストラクタで明示初期化。
- var(型推論・Java 10+):
var count = 1; // int と推論
var msg = "hi"; // String と推論
// var はローカル変数のみ。可読性が落ちるなら使わない選択もOK。
Java- final(再代入禁止):
final int MAX = 100; // 定数っぽく使う
// MAX = 200; // コンパイルエラー
Java- ラッパー型とオートボクシング:
- ラッパー型: Integer, Long, Double, Boolean など(参照型)。コレクションでプリミティブを扱う時に使う。
- オートボクシング/アンボクシング: int ⇄ Integer の自動変換。null の Integer をアンボクシングすると例外に注意。
- コピーの誤解:
- プリミティブの代入は値のコピー。
- 参照型の代入は参照のコピー(同じオブジェクトを指す)。独立させたいなら“ディープコピー”を作る。
- 文字列の結合効率:
- 繰り返し結合は StringBuilder を使うと効率的。
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 3; i++) sb.append(i).append(",");
String result = sb.toString(); // "0,1,2,"
Javaコードテンプレート集(初心者向け)
1. 変数宣言・初期化の基本形
int count = 0;
double rate = 1.5;
boolean ok = false;
char letter = 'J';
String title = "Java入門";
Java2. 配列の初期化パターン
// 長さだけ
int[] nums = new int[3]; // {0,0,0}
// 値を並べる
int[] points = {10, 20, 30};
// 2次元配列
int[][] grid = {
{1, 2},
{3, 4}
};
Java3. クラスとフィールドの初期化
class Account {
String owner; // 参照型フィールド(デフォルトは null)
int balance; // プリミティブフィールド(デフォルトは 0)
Account(String owner, int initial) { // コンストラクタで明示初期化
this.owner = owner;
this.balance = initial;
}
}
Account a = new Account("Sato", 500);
Java4. 安全な参照チェック(null回避)
String s = null;
if (s != null && s.length() > 0) {
System.out.println("長さ: " + s.length());
} else {
System.out.println("未設定です");
}
Java5. ラッパー型とコレクション
import java.util.ArrayList;
import java.util.List;
List<Integer> list = new ArrayList<>();
list.add(10); // int → Integer に自動変換
Integer x = list.get(0);
Java例題で身につける(解説つき)
例題1: 参照の共有を体感する
- ねらい: プリミティブと参照型の“コピーの違い”を理解する。
- やること: 下のコードの出力を予想してから、実行して確認。
int a = 5;
int b = a;
b = 9;
System.out.println(a); // ?
int[] arr = {1, 2};
int[] arr2 = arr;
arr2[0] = 99;
System.out.println(arr[0]); // ?
Java- ポイント:
- プリミティブ: a は 5 のまま。
- 参照型: arr と arr2 は同じ配列を参照しているため、両方に 99 が見える。
例題2: null を避ける初期化
- ねらい: 参照型の初期化を習慣化する。
- やること: Person を安全に生成して使う。
class Person {
String name;
Person(String name) { this.name = name; }
}
Person p = new Person("Yamada");
if (p != null && p.name != null) {
System.out.println(p.name.toUpperCase());
}
Java- ポイント: コンストラクタで必須フィールドを受け取ると、null チェックの手間が減る。
例題3: String と StringBuilder の違い
- ねらい: 文字列の結合効率を体験。
- やること: 100回の結合を両方式で試す(処理時間をざっくり比較)。
// 非効率になりがち
String s = "";
for (int i = 0; i < 100; i++) {
s += i;
}
// 効率的
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 100; i++) {
sb.append(i);
}
String t = sb.toString();
Java- ポイント: 繰り返し結合は StringBuilder。たまの結合なら String でもOK。
次の一歩
- 練習の提案:
- 配列のコピー: System.arraycopy と Arrays.copyOf を使って“別物”を作る。
- ラッパー型の落とし穴: List<Integer> に null を入れて取り出すとどうなるか試す。
- final の使い分け: 参照を final にしても“中身の変更”は可能か検証(例: final int[])。

