Javaで2つのpublic classを持つプログラムを実行する方法

はじめに (対象読者・この記事でわかること)

この記事は、Javaでプログラミングを始めたばかりの初学者を対象にしています。
特に「1つのファイルに複数のクラスを書きたい」「public classとclassの違いがいまいち分からない」という方に向けて、2つのpublic classを持つプログラムを正しく実行する方法を解説します。
この記事を読むことで、Javaのファイル構成ルールと、複数クラスを管理するためのベストプラクティスが身につきます。

前提知識

この記事を読み進める上で、以下の知識があるとスムーズです。

  • Javaの基本的な文法(クラス定義、mainメソッド)
  • ターミナルでのjavac/javaコマンドの使い方
  • テキストエディタでの簡単なプログラム作成経験

Javaのファイル構成ルールとpublic classの制限

Javaには「1ファイルにpublic classは1つまで」という厳格なルールがあります。
これはコンパイラがファイル名とpublic class名を一致させるためであり、2つ以上存在するとコンパイルエラー「class XXX is public, should be declared in a file named XXX.java」が発生します。
このルールを理解しないまま複数のpublic classを書くと、初心者は「なぜ動かないのか?」と戸惑いがちです。
そこで、まずはこの制限の理由と、それを回避するための正しいファイル分割方法を理解しましょう。

2つのpublic classを正しく実行する具体的手順

ステップ1:ファイルを分割する

Main.javaとSub.javaの2ファイルを作成します。
ファイル名とpublic class名を必ず一致させることで、コンパイルエラーを回避できます。

Java
// Main.java public class Main { public static void main(String[] args) { Sub.greet(); } }
Java
// Sub.java public class Sub { public static void greet() { System.out.println("Hello from Sub!"); } }

ステップ2:コンパイルと実行

ターミナルで以下のコマンドを実行します。

Bash
# コンパイル(複数ファイルまとめて可能) javac Main.java Sub.java # 実行(mainメソッドを持つクラスを指定) java Main

ハマった点:1ファイルに2つのpublic classを書いてしまう

以下のように1ファイルに2つのpublic classを書くと、先に述べたエラーが発生します。

Java
// Hoge.java public class Hoge { } // ファイル名と一致 public class Piyo { } // ファイル名と不一致 → コンパイルエラー

解決策:package-private classにする

publicを外した「package-private(デフォルト)クラス」にすると、1ファイルに複数定義できます。

Java
// Hoge.java public class Hoge { } // ファイル名と一致 class Piyo { } // publicを外す

この場合、Hoge.javaのみでコンパイル・実行可能です。

Bash
javac Hoge.java java Hoge

ただし、package-privateクラスは同じパッケージ内からのみアクセス可能なため、大規模開発では推奨されません。

まとめ

本記事では、Javaで2つのpublic classを実行する際のルールと対策を解説しました。

  • 1ファイルにpublic classは1つまで(ファイル名と一致必須)
  • 複数public classが必要ならファイルを分割する
  • publicを外せば同一ファイルに複数クラスを書けるが、アクセス制限に注意

この記事を通して、Javaのファイル構成ルールを理解し、コンパイルエラーを回避できるようになりました。
次回は、package-privateクラスを活用した実用的なユーティリティ構成について解説します。

参考資料