| この記事の要点 |
|
概要
Java は、Sun Microsystems の James Gosling らが 1991 年に「Oak」という名前で開発を始め、1995 年 5 月 23 日に「Java」として正式公開された静的型付けオブジェクト指向言語です。Sun が 2010 年に Oracle に買収されて以降、現在は Oracle が管理しています。最大の特徴は「Write Once, Run Anywhere(一度書けばどこでも動く)」というスローガンに表れているとおり、JVM(Java Virtual Machine)上でバイトコードを実行することで OS 差異を吸収する点です。
ソースファイルの拡張子は .java、コンパイルすると .class という JVM バイトコードのファイルが生成され、JVM がこれを解釈・実行(または JIT コンパイル)します。複数の .class とリソース(画像・設定ファイルなど)をまとめた配布形式が .jar(Java ARchive)で、その実体は ZIP アーカイブです。unzip foo.jar で中身を取り出せます。Web アプリ向けには .war(Web ARchive)、エンタープライズ向けには .ear(Enterprise ARchive)もあり、これらもすべて ZIP ベースです。
Java の型システムには ジェネリクスがありますが、「型消去(type erasure)」方式で実装されています。これは List<String> も List<Integer> も実行時には単なる List として扱われることを意味します。後方互換性のため採用された設計ですが、new T() ができない・プリミティブ型をジェネリクスに使えないなどの制約を生んでいます。
用途は エンタープライズ Web アプリ(Spring / Spring Boot)・Android(公式は Kotlin に移行中だが既存は Java)・ビッグデータ基盤(Hadoop / Kafka / Cassandra / Elasticsearch)・金融系基幹システム など極めて幅広く、世界の Web サービスの裏側で最も多く動いている言語のひとつです。半年ごとにリリースされる現行版(OpenJDK 21 LTS, 17 LTS, 11 LTS)が広く使われています。
ファイル種類とビルド成果物
| 拡張子 | 役割 | 変換ステップ |
|---|---|---|
.java | ソースコード | 入力 |
.class | JVM バイトコード(クラスごとに 1 ファイル) | javac File.java |
.jar | 複数 .class + リソースを ZIP 圧縮した配布形式 | jar cf app.jar -C target/classes . |
.war | Web アプリ用 JAR(WEB-INF/web.xml 構造) | Tomcat 等に配置 |
.ear | エンタープライズ JAR(EJB コンテナ用) | JBoss / WildFly 等 |
MANIFEST.MF | JAR 内のメタ情報(Main-Class など) | META-INF/ 直下 |
ビルドフロー: Hello.java → javac Hello.java → Hello.class → jar cfe hello.jar Hello Hello.class → java -jar hello.jar。最終的に JVM がバイトコードを実行(JIT で機械語に変換)します。
「Hello, World」
// Hello.java
public class Hello {
public static void main(String[] args) {
System.out.println("Hello, World");
// ジェネリクスの例
java.util.List<String> names = new java.util.ArrayList<>();
names.add("Java");
names.add("Kotlin");
for (String n : names) {
System.out.println(n);
}
}
}
$ javac Hello.java # Hello.class が生成される
$ java Hello # JVM で実行
Hello, World
# JAR にまとめる
$ jar cfe hello.jar Hello Hello.class
$ java -jar hello.jar
Hello, World
パッケージ管理・ビルドツール
Java のビルドツールは長らく Apache Maven(XML ベース pom.xml)と Gradle(Groovy / Kotlin DSL)が二大勢力で、依存は Maven Central から取得します。
<!-- pom.xml (Maven) -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>3.2.0</version>
</dependency>
// build.gradle (Gradle / Groovy DSL)
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web:3.2.0'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
mvn clean package # Maven: ビルド + テスト + JAR 生成
mvn spring-boot:run # Spring Boot 起動
gradle build # Gradle: ビルド
gradle bootRun # Spring Boot 起動
関連言語との比較
| 項目 | Java | Kotlin | C# | Go |
|---|---|---|---|---|
| 実行環境 | JVM | JVM(および JS / Native) | .NET CLR | ネイティブ |
| Null 安全 | なし(NPE 多発) | あり(String?) | あり(string?) | nil チェック必要 |
| ジェネリクス | 型消去 | 型消去(reified 例外) | 具象化(実行時に型保持) | 1.18+ 型パラメータ |
| 記述量 | 多い(冗長) | 少ない | 中程度 | 少ない |
| Android | レガシー採用 | 公式推奨 | — | — |
注意点・落とし穴
- NullPointerException(NPE):null チェック忘れで頻発。
Optional<T>や Kotlin 移行が対策。 - 型消去によるジェネリクス制約:
new T()やT.classが書けない。Class<T>をパラメータで渡す回避策が必要。 - checked exception の伝染:
throws IOExceptionが呼び出し元に波及し、ボイラープレートが増える。 - JAR Hell / classpath 地獄:同名クラスが複数 JAR に存在するとロード順で挙動が変わる。モジュールシステム(JPMS, Java 9+)が対策だが普及途上。
- 起動時間とメモリ:JVM 起動コストが大きく、CLI 用途には不向き。GraalVM Native Image で改善可。
関連リンク
- プログラミング・スクリプト(親カテゴリ)
- ファイル拡張子とは(概論)
- プログラミング言語(カテゴリ)
- アーカイブ・圧縮形式(.jar は ZIP)
- Kotlin(.kt / .kts)
- Go(.go)
子ページはありません
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript で base URL を取得する方法|window.location.origin
- 4 YouTube Data API v3 エラー一覧|403・400・404 の原因と対処
- 5 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 6 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 7 Spring Frameworkのアノテーション一覧
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- Git pushした変更の取消し|revert・履歴変更と保護の注意点 2026-10-15 23:49:01
- Gitでローカルを戻す前に|reset・restoreの違いと退避範囲 2026-10-15 23:49:01
- Git rebaseの使い方|対象範囲・競合解決・pushの判断 2026-10-15 22:50:59
- Git pullの使い方|取込み先・ff-only・競合とstashの注意点 2026-10-15 22:50:59
- Git pushの使い方|送信先・タグ・force-with-leaseの条件 2026-10-15 22:12:47
- Git remoteの設定・確認・削除|SSH URLとfetch/pushの違い 2026-10-15 22:12:47
- Gitリモートリポジトリの作成|初回push・既存履歴・mirrorの注意 2026-10-15 15:48:16
- Gitのuser.name・user.email設定|local/global・確認と過去履歴の注意 2026-10-15 15:30:07
- LinuxにGitをインストール|配布元・初期設定・TLSと認証の確認 2026-10-15 15:30:06
- Git導入と初回push|Linuxサーバー・Windows/macOS・SSH設定 2026-10-15 14:51:54
- Db2のCREATE INDEX|索引定義・INCLUDEと実行計画の確認 2026-10-15 14:10:22
- Db2の自動採番|IDENTITY・ID取得とRESTARTの注意点 2026-10-15 14:10:22
- 【DB2】特定スキーマの全テーブルの全カラム情報を取得する方法 2026-10-15 13:53:15
- Db2のシーケンスとIDENTITYの違い|採番とカタログの確認SQL 2026-10-15 13:53:15
- Db2で複数カラムをUPDATEする方法|SET・WHEREと更新前の値 2026-10-15 13:53:15