Dev Study
← Spring コース

2. .java・.class・バイトコード・javac

は、(Java のコンパイラ)がソースの から作るファイルで、 が読むのはこのファイルです。中身は JVM 向けの命令列で、と呼びます。TypeScript で言うと、javac が tsc、.class が tsc の出す .js に近い位置にあります。ただし .js は人が読めるソースですが、.class は人が読む形ではないバイナリです。

ソースに書くのはです。クラスは(データ)と(処理)をまとめた型の定義で、new で作った実体をと呼びます。 の付いたメソッドはクラスに属し、オブジェクトが無くても呼べます。JVM は、起動のときに指定されたクラスの というメソッドを最初に呼びます。.class はクラスや1つにつき1ファイルで、下のコードからは3つできます。

TypeScript の class と形は似ていますが、違いがあります。Node は実行するファイルを指定して上から実行します。Java は、.class にしてから動かす場合、実行するクラスを指定して main から始めます。ファイルの一番外に文は書けません。main の書き方は、 22 の既定の設定では static void main(String[] args) の形が必須で、JDK 25 で緩みました。

点線の付いた語はタップすると説明が出ます。用語集を開く →

ソースが動くまで(右の → は TypeScript と Node で近いもの)
ソース(.java)人が書く。クラスの宣言が入っている
TypeScript: .ts
javac でコンパイルする
.classクラスやインターフェース1つにつき1ファイル。中身はバイトコード
TypeScript: tsc が出す .js(こちらはソース)
java クラス名(.class にしてから動かす場合)
JVM.class を読み、指定されたクラスの main を呼ぶ
Node: node ファイル名
main から実行が始まる
プログラムの出力
  • ・javac は JDK に入っています。tsc は npm で後から入れる別のパッケージです
  • ・下のコードを javac にかけると、Greeter.class、Main.class、PoliteGreeter.class の3つができました(JDK 22)。ソースファイル1つにつき1つ、ではありません。インターフェースも1ファイルになります
  • ・.class の先頭4バイトは CAFEBABE と決まっています。中の命令は、JDK に入っている javap という道具で読める形にできます。後のレッスンで扱います
  • ・TypeScript の interface は tsc を通すと消えますが、Java のインターフェースは .class になり、実行時にも残ります
  • ・main について、言語仕様(JLS SE 25 の 12.1.4 節)は、Java SE 25 より前は public で static で引数が1つという形が必須だった、と注記しています。JDK 25 では void main() だけのクラスも動きました。エラーの実物はサンプル集にあります
  • ・.js との対応は位置のたとえです。.class には型の情報が残り、.js からは TypeScript の型が消えている、という違いもあります

▶ サンプルコードを実行してみよう(自由に書き換えてOK)

Java

図やコードに出てくる用語(タップで説明)

サンプルコードで身につける(5本) →

学んだ概念を、素朴な例から実務寄りの例まで5つの具体例で確認します。

公式ドキュメントで詳しく ↗