

以下のプログラムで質問があります。  
以下のプログラムをjavac Main1.javaでコンパイルすると、コンパイルエラーが出ます。  
エラー内容

[code]

    Main1.java:20: エラー: クラス Heroはpublicであり、ファイルHero.javaで宣言する必要があります
            public class Hero{
                   ^
    
[/code]

恐らく、Heroクラスをネストしていない（Main1クラスの中に組み込んでいない）ため、独立したクラス2つがあり、エラーが出ているのだとも思います。今回のように、クラスをネストしない場合は、どのように実行すればいいでしょうか？

[code]

    import java.util.*;
    import java.awt.event.*;
    import javax.swing.*;
    
    
    
        public class Main1{
            public static void main(String[]args){
                Hero a= new Hero();
    
                a.name = "ピカチュウ";
                a.hp=100;
    
                System.out.println("勇者"+a.name+"を生み出した！");
    
                a.sit(5);
            }
          }
    
            public class Hero{
              String name;
              int hp;
              int level=10;
          
              public void sleep(){
                this.hp=100;
                System.out.println(this.name+"は眠って回復した！");
              }
          
              public void sit(int sec){
                this.hp+=sec;
                System.out.println(this.name+"は"+sec+"秒座った");
              }
          }
    
    
[/code]


CC BY-SA 4.0
2020-07-27T04:09:19.527
69007
2020-07-27T20:12:00.000
2020-07-27T19:48:55.230
2808
39688
question
java
2つのpublic classのプログラムを実行する場合の方法


Public classの宣言を含むJavaのソースファイルには、クラス名.java というファイルを付けてください。  
クラス名.javaをjavacでコンパイルすると、クラス名.classというクラスファイルが出来ます。

そして、"java クラス名" というコマンドで、クラス名のjavaプログラムが実行されます。

ファイル名に含まれているクラス名を頼りにして、どこを実行したら良いのかを決めるので、クラス名とファイル名に齟齬があるとエラーとなります。

これは、javaでのお約束なので、かならず守るようにしてください。


CC BY-SA 4.0
2020-07-27T04:30:15.340
69009
2020-07-27T04:30:15.340
217
69007
answer


質問するときは環境に関する情報を詳しく記述しましょう。  
Javaの場合はJDKのバージョンを記載します。統合開発環境を使っているのであればその名前とバージョンを記載します。OSも記載しておいたほうがよいです。

  * [技術系メーリングリストで質問するときのパターン・ランゲージ](https://www.hyuki.com/writing/techask.html)

Javaの最外`public`クラスは、1つのソースファイルに1つだけ定義することが許可されます。  
最外`public`クラスを複数定義したい場合は、ソースファイルを分割する必要があります。

[code]

    // Main.java
    public class Main {
    ...
    }
    
[/code]

[code]

    // Sub1.java
    public class Sub1 {
    ...
    }
    
[/code]

複数のソースファイルからなるJavaプログラムを javac でコンパイルする場合は、以下などを参考にしてください。

  * [Javaプログラミング・ワンポイントレクチャー：前提知識 javacコマンドを使いこなす](https://www.atmarkit.co.jp/fjava/onepoint/java/jv_jvc.html)

※直感的な操作や、デバッグしやすさなどの観点から、IntelliJ IDEAやEclipseなどの統合開発環境を使用することを推奨します。

ただし、クラスの`public`指定は、パッケージの外にクラスを公開したいときに使うものです。パッケージ内で完結するクラスであれば、アクセスレベル無指定の
**パッケージプライベート**
を使用する方法もあります。パッケージプライベートの最外クラスは、1つのファイルにいくつでも定義できます。`public`クラスを1つも定義せず、パッケージプライベートクラスだけ定義することもできます。

[code]

    // Main.java
    public class Main {
    ...
    }
    
    class Sub1 {
    ...
    }
    
    class Sub2 {
    ...
    }
    
[/code]

上記は無名パッケージの例ですが、Java
1.4以降では無名パッケージのクラスは`public`であっても`import`できないため、クラスを`public`にする意義はほとんどありません。通例`public`クラスを定義する場合、例えば下記のようにパッケージ名を明示的に指定します。

[code]

    // com/example/myapp/Main.java
    package com.example.myapp;
    
    public class Main {
    ...
    }
    
[/code]

[code]

    // com/example/mylib/Sub1.java
    package com.example.mylib;
    
    public class Sub1 {
    ...
    }
    
    class PackagePrivateSub1 {
    ...
    }
    
[/code]

`com.example.myapp.Main`クラスから`com.example.mylib.Sub1`クラスは見えます。  
`com.example.myapp.Main`クラスから`com.example.mylib.PackagePrivateSub1`クラスは見えません。  
`com.example.mylib.Sub1`クラスから`com.example.mylib.PackagePrivateSub1`クラスは見えます。

パッケージの分割は、プラグインやライブラリの作成時、大規模アプリケーション開発時には必須ですが、入門レベルではほとんど意識する必要はありません。

なお、「Java
publicクラス」などでGoogle検索すれば、いくらでも情報がヒットします。他者に質問する前に、まずは自分で複数の入門サイトをいくつか訪れて情報を整理したり、適当な入門書を読んだりして、Javaの基礎を体系的・総合的に学習してください。

  * [別の質問をしようとするとシステムから1日以上待つように言われました。これはなぜですか？ - ヘルプ センター - スタック・オーバーフロー](https://ja.stackoverflow.com/help/asking-rate-limited)

> 質問を投稿する前にあなた自身で調査をすることを忘れないでください。そして、 **本当に行き詰まった時にだけ** 質問するようにしてください。


CC BY-SA 4.0
2020-07-27T18:10:02.650
69037
2020-07-27T18:36:13.097
2020-07-27T18:36:13.097
15413
15413
69007
answer


質問文中に記載されているエラーメッセージの通り、publicな`Hero`クラスは`Hero.java`という名前のファイル内で宣言する必要があります。  
(そしてpublicな`Main1`クラスは`Main1.java`ファイル内で宣言する必要があります(が、これは既に守られているのでエラーは出ていません))

つまり、次の2ファイルが必要です。

`Main1.java`:

[code]

    public class Main1 {
        public static void main(String[] args) {
            Hero a = new Hero();
    
            a.name = "ピカチュウ";
            a.hp = 100;
    
            System.out.println("勇者" + a.name + "を生み出した！");
    
            a.sit(5);
        }
    }
    
[/code]

`Hero.java`:

[code]

    public class Hero {
        String name;
        int hp;
        int level = 10;
    
        public void sleep() {
            this.hp = 100;
            System.out.println(this.name + "は眠って回復した！");
        }
    
        public void sit(int sec) {
            this.hp += sec;
            System.out.println(this.name + "は" + sec + "秒座った");
        }
    }
    
[/code]

* * *

補足としてコマンドラインからの実行方法を記載します。

実行するには、まずこれらの2ファイルを`javac`コマンドでコンパイルし:

[code]

    javac -d classes Main1.java Hero.java
    
[/code]

その後`java`コマンドで`main`メソッドを含むクラスであるところの`Main1`を指定します:

[code]

    java -cp classes Main1
    
[/code]

コマンドの引数詳細などは公式ドキュメント([`javac`](https://docs.oracle.com/javase/jp/11/tools/javac.html#GUID-
AEEC9F07-CB49-4E96-8BC7-BCC2C7F725C9),[`java`](https://docs.oracle.com/javase/jp/11/tools/java.html#GUID-3B1CE181-CD30-4178-9602-230B800D4FAE))で説明されています。


CC BY-SA 4.0
2020-07-27T20:12:00.000
69039
2020-07-27T20:12:00.000
2808
69007
answer