java.lang パッケージとは何か
java.lang は、
「Java でプログラムを書くときに、ほぼ必ず使う“基本中の基本”がまとまったパッケージ」
です。
特徴として
import を書かなくても、勝手に使える
文字列、数値、スレッド、例外などの“言語レベルの基本要素”が入っている
Java を書くうえで「空気」のように存在している
という位置づけです。
なので、java.lang をざっくりでも把握しておくと、
「これは標準でこういうクラスがあるんだ」と迷わなくなります。
ここでは、特に初心者がまず押さえておきたい主要なクラス・インターフェースを、
例を交えながら丁寧に解説します。
Object クラス:すべての親玉
すべてのクラスの大元
java.lang.Object は「すべてのクラスの親クラス」です。
自分でクラスを書くとき、extends を書かなくても、暗黙的に Object を継承しています。
public class User {
// 実は Object を継承しているのと同じ
}
Pythonだから、どんなクラスも最低限 Object が持っているメソッドを使えます。
代表的なのが
toString()equals(Object obj)hashCode()getClass()
などです。
toString と equals の意味(重要)
初心者のうちに特に意識してほしいのは toString と equals です。
toString() は「そのオブジェクトを文字列として表現するときに呼ばれる」メソッドです。
User user = new User("Taro");
System.out.println(user); // → 内部的には user.toString() が呼ばれる
Python自分のクラスで toString() をオーバーライドすると、デバッグやログが一気に見やすくなります。
@Override
public String toString() {
return "User{name=" + name + "}";
}
Pythonequals(Object obj) は「このオブジェクトと、引数のオブジェクトが“等しい”かどうか」を判定するメソッドです。
値オブジェクト(Money, EmailAddress など)を作るときは、equals と hashCode を正しくオーバーライドするのが超重要になります。
Object は「オブジェクトとしての最低限の性質」を提供するクラスだ、
と認識しておくと良いです。
String クラス:文字列のど真ん中
文字列は全部 String
java.lang.String は「文字列」を表すクラスです。
String name = "Taro";
String message = "Hello, " + name;
JavaJava では、
シングルクォート 'a' が char(1文字)、
ダブルクォート "abc" が String(文字列)です。
String がイミュータブルであること(重要)
String は「イミュータブル(不変)」です。
一度作られた String の中身(文字列)は、あとから変更できません。
String s = "hello";
s.toUpperCase(); // "HELLO" を返すが、s 自体は変わらない
System.out.println(s); // hello
JavatoUpperCase() や replace() などは、
「元の String を変える」のではなく「新しい String を返す」ことに注意してください。
String upper = s.toUpperCase();
System.out.println(upper); // HELLO
Javaこの性質は、マルチスレッドでも安全に使える・hashCode の扱いが安定する
など、多くの場面で効いてきます。
よく使うメソッドのイメージ
String s = "abcde";
int len = s.length(); // 5
char c = s.charAt(0); // 'a'
boolean b = s.startsWith("ab"); // true
String t = s.substring(1, 3); // "bc"
JavaString は本当に出番が多いので、
「イミュータブル」「メソッドは新しい String を返す」だけは頭に置いておくと迷いません。
ラッパークラス:int などの“オブジェクト版”
基本型と参照型の橋渡し
java.lang には、プリミティブ型(基本型)の“ラッパークラス”が用意されています。
int → Integerlong → Longdouble → Doubleboolean → Boolean
…など。
int n = 10;
Integer boxed = Integer.valueOf(n); // int → Integer
int unboxed = boxed.intValue(); // Integer → int
JavaJava 5 以降はオートボクシング/アンボクシングがあるので、たいていは暗黙的に変換してくれます。
Integer boxed2 = 10; // 自動で int → Integer
int n2 = boxed2; // 自動で Integer → int
Javaどんなときに必要になるか(重要)
ラッパークラスが必要になる代表的な場面は
コレクションで扱うとき(List<int> は書けないので List<Integer>)
null を扱いたいとき(基本型は null を取れない)
です。
例えば
List<Integer> list = new ArrayList<>();
list.add(10); // OK。Integer に自動変換
Javaプリミティブ型は軽量で高速ですが、
「コレクションに入れたい」「null を扱いたい」といった場面では
ラッパークラスにしておく必要があります。
Math クラス:数学系の便利屋
数学関数の“まとめサイト”
java.lang.Math は、
「よく使う数学系の処理」を静的メソッドで提供するクラスです。
すべて static メソッドなので、new はしません。
int abs = Math.abs(-10); // 10
double pow = Math.pow(2, 3); // 8.0
double sqrt = Math.sqrt(16); // 4.0
double max = Math.max(5, 9); // 9
Java実務でよく使うイメージ
小数の切り上げや切り捨てもよく使います。
double x = 3.7;
double floor = Math.floor(x); // 3.0
double ceil = Math.ceil(x); // 4.0
long round = Math.round(x); // 4(四捨五入)
Java乱数は Math.random() もありますが、
本格的には java.util.Random や java.util.concurrent.ThreadLocalRandom を使うことが多いです。
最初は「Math に最低限の数学関数がまとめてある」と覚えておけば十分です。
System クラス:標準入出力や環境への窓口
標準出力・エラー出力
java.lang.System は、「システム全体(JVM)の入口」のようなクラスです。
一番よく使うのは System.out や System.err でしょう。
System.out.println("こんにちは"); // 標準出力
System.err.println("エラーです"); // 標準エラー出力
JavaSystem.out は PrintStream 型で、println などのメソッドを持っています。
現在時刻や環境変数
他にも、現在時刻(ミリ秒)や環境変数なども取れます。
long millis = System.currentTimeMillis(); // エポックからのミリ秒
String javaVersion = System.getProperty("java.version");
JavaSystem は「JVM や OS の情報を覗きたいとき」に使うイメージでいてください。
Thread・Runnable:スレッドの基礎
Runnable と Thread の関係(ざっくり)
java.lang.Runnable は「run という処理を持つもの」というインターフェースです。
public class MyTask implements Runnable {
@Override
public void run() {
System.out.println("別スレッドで実行中");
}
}
Javaこれを Thread に渡して動かします。
Runnable task = new MyTask();
Thread thread = new Thread(task);
thread.start(); // 新しいスレッドで run が実行される
Java今どきは ExecutorService(java.util.concurrent)を使うことも多いですが、
Thread / Runnable は「スレッドの入り口」として覚えておく価値があります。
初心者の段階では、
「Runnable = 実行したい処理Thread = それを別スレッドで動かす器」
くらいの理解で十分です。
例外関連:Throwable / Exception / RuntimeException
例外階層の一番上が Throwable
java.lang.Throwable が「すべての例外・エラーの大元」です。
その下に Error と Exception がぶら下がります。
Exception の下には、さらに
チェック例外(IOException, SQLException など)
非チェック例外(RuntimeException とそのサブクラス)
があります。
例えば自作の例外は、だいたい Exception か RuntimeException を継承します。
public class BusinessException extends RuntimeException {
public BusinessException(String message) {
super(message);
}
}
Java初心者がまず押さえるポイント
チェック例外は「throws を書くか try-catch で捕まえないとコンパイルエラー」になる例外です。
非チェック例外(RuntimeException)は、コンパイル時に強制されません。
public void readFile() throws IOException {
// チェック例外なので throws が必須
}
Javapublic void doSomething() {
if (somethingWrong) {
throw new IllegalStateException("状態がおかしい"); // RuntimeException の一種
}
}
Java細かいルールは後からでよくて、
「例外関連の親クラスも java.lang にいる」
「RuntimeException を投げるときは、本当にそれでいいか一度考える」
くらいを意識しておくとよいです。
そのほか知っておくと嬉しいクラス・インターフェース
StringBuilder / StringBuffer
String はイミュータブルなので、
何度も連結するときは StringBuilder を使うほうが効率的です。
StringBuilder sb = new StringBuilder();
sb.append("Hello");
sb.append(" ");
sb.append("World");
String result = sb.toString(); // "Hello World"
Java大量連結やループの中での連結では、+より StringBuilder が推奨されます。
Enum
java.lang.Enum は列挙型の親クラスです。
普段は enum を使う形で触れます。
public enum UserStatus {
ACTIVE,
INACTIVE,
BANNED;
}
Javaenum 自体はキーワードですが、実際には Enum を継承したクラスとして扱われます。
まとめ:java.lang をどう捉えればいいか
java.lang は
Java プログラムの「土台」にあたるクラス・インターフェースが詰まったパッケージ
import なしで常に見えている
Object / String / ラッパークラス / Math / System / Thread / 例外あたりが特に重要
という位置づけです。
最初からすべてを暗記する必要はありません。
むしろ、
「文字列まわりで何かしたい → String, StringBuilder を調べてみる」
「数値をオブジェクトで扱いたい → Integer, Long などを調べる」
「例外やスレッドに触れたくなった → java.lang の中に何があるか見てみる」
という感じで、「困ったときに戻ってくる“道具箱”」として少しずつ馴染んでいけば十分です。

