以下は「Java基礎構文① 変数と型」の記事本文(WordPressブロックエディターへそのまま貼り付け可)です。水平線は使用していません。
目次
Java基礎構文① 変数と型
要約
- Javaは強い型付け言語。変数は「宣言 → 初期化 → 利用」の順で扱います。
- 型は「基本型(primitive)」と「参照型(reference)」に大別されます。
- 文字列は不変(immutable)。金額などは
BigDecimal
を用います。 var
はローカル変数限定で型推論。必ず初期化が必要です。
1. 変数の基本
int count; // 宣言
count = 10; // 代入
int size = 20; // 宣言と初期化
final double PI = 3.14159; // 定数(再代入不可)
- スコープは宣言したブロック
{ ... }
内に限定。 - シャドーイングは可読性低下のため原則回避。
var
(Java 10+)
var n = 10; // 推論: int
var name = "Bob"; // 推論: String
- ローカル変数のみ使用可(フィールド・引数・戻り値は不可)。
- 初期化必須。可読性を損ねる場合は明示的な型を優先。
2. 型の種類
2.1 基本型(primitive)
- 整数:
byte
(8),short
(16),int
(32),long
(64)
例)int x = 123;
、long y = 10_000_000_000L;
- 浮動小数:
float
(32),double
(64)
例)float f = 3.14f;
、double d = 3.14;
- 文字:
char
(16, UTF-16コード単位)
例)char c = 'A';
- 真偽:
boolean
(サイズ実装依存)
例)boolean ok = true;
補足:絵文字などサロゲートペアは
char
1つで表せない場合があります。
2.2 参照型(reference)
String
、配列、クラス/インターフェースのインスタンス、enum
、record
など。null
を取り得るため、NPE対策が必要です。
3. 文字列と文字
String s = "Hello";
s = s + " World"; // Stringは不変。新インスタンスが生成される
StringBuilder sb = new StringBuilder();
sb.append("Hello").append(" World");
String fast = sb.toString(); // 連結が多い場合はStringBuilder推奨
- 内容比較は
.equals()
、==
は参照比較です。
"abc".equals(someString); // 内容比較(推奨)
String.length()
はUTF-16の長さ。コードポイント数は:
int cps = s.codePointCount(0, s.length());
4. 数値演算の注意点
double a = 0.1 + 0.2; // 0.30000000000000004(桁誤差)
- 金額など厳密小数は
BigDecimal
を使用します。
import java.math.BigDecimal;
BigDecimal p = new BigDecimal("0.1").add(new BigDecimal("0.2")); // 0.3
5. 型変換(キャスト)
- 拡大変換(安全):
int -> long -> float -> double
- 縮小変換(要キャスト・精度喪失の可能性):
long x = 100; // 拡大: OK
int y = (int) x; // 縮小: 明示キャスト
6. 配列とArrayList
int[] a = new int[3];
a[0] = 10; a[1] = 20; a[2] = 30;
int[] b = { 1, 2, 3 }; // 配列リテラル
import java.util.ArrayList;
var list = new ArrayList<String>();
list.add("A"); list.add("B");
String first = list.get(0);
- 配列は固定長。
ArrayList
は可変長。 - ジェネリクスで型安全に扱います(
new ArrayList<String>()
)。
7. enum
と record
(Java 16+)
enum Role { ADMIN, USER, GUEST }
record Point(int x, int y) {} // 不変データキャリア
Point p = new Point(10, 20);
record
はフィールド、コンストラクタ、equals/hashCode/toString
を自動生成。
8. Optional
の基本(Null対策)
import java.util.Optional;
Optional<String> maybe = Optional.of("Bob");
String name = maybe.orElse("Unknown");
- 戻り値に
Optional<T>
を用いると「値がない」状態を明示できます。 - フィールドに
Optional
は原則使いません(オブジェクト肥大化回避)。
9. 参照と値、引数の挙動
- Javaはすべて値渡し。参照型は「参照という値」を渡します。
class Box { int v; }
void inc(Box b){ b.v++; } // 参照先の中身は変わる
void reassign(Box b){ b = new Box(); b.v = 999; } // 呼び出し側の参照は変わらない
10. 1ファイルで動く最小サンプル
public class BasicsVariables {
enum Role { ADMIN, USER, GUEST }
record Point(int x, int y) {}
public static void main(String[] args) {
int count = 10;
long big = 10_000_000_000L;
double price = 123.45;
var ok = true; // boolean
var name = "Alice"; // String
String msg = "Hello";
msg = msg + " Java";
System.out.println(msg); // Hello Java
int[] nums = {1, 2, 3};
java.util.ArrayList<String> list = new java.util.ArrayList<>();
list.add("A"); list.add("B");
System.out.println(list.get(0)); // A
Role r = Role.USER;
Point p = new Point(3, 5);
System.out.println(r + " " + p);
long lx = 100;
int ix = (int) lx;
String s1 = new String("abc");
String s2 = "abc";
System.out.println(s1.equals(s2)); // true(内容)
System.out.println(s1 == s2); // false(参照)
java.util.Optional<String> maybe = java.util.Optional.of("Bob");
System.out.println(maybe.orElse("Unknown"));
}
}
ベストプラクティス(要点)
- 意味のある型を選ぶ(貨幣=
BigDecimal
、識別子=String
/UUID
等)。 - 文字列比較は
.equals()
、多連結はStringBuilder
。 var
は短いスコープでのみ使用。可読性を最優先。null
は最小化し、戻り値はOptional
で明示。- 定数は
public static final
+大文字スネークで命名統一。