質問: このようなクラスを作って実行したのですが、The constructor Empty() is not visibleというエラーが出ます。なぜなのでしょうか? //一つ目のクラスEmpty.java public class Empty{} //2つ目のクラスMain.java public class Main{ public static void main(String[] args){ Empty e=new Empty(); String s=e.toString(); System.out.println(s); } } しっかり同じパッケージ煮含めているのですが、なぜなのでしょうか?
回答: いろいろ実験をしたところ、下記の状態で再現できました。 ``` // Empty.javaのファイル package d; //一つ目のクラスEmpty.java public class Empty{ public Empty(int intValue) {} public Empty(String stringValue) {} public Empty(float flatValue) {} } ``` の状態で実行し、 ``` Exception in thread "main" java.lang.Error: Unresolved compilation problem: コンストラクター Empty() は未定義です at d.Main.main(Main.java:7) ``` コンストラクタメソッドとして、「引数ありメソッド」を定義し、 「引数なしメソッド」が無い状態にしてしまうと上記のエラーメッセージが表示されました。 質問文の中ではEmptyクラスの中身が何もない状態で張り付けられておられますが、 実際にはメソッドがありますでしょうか? もしその場合、変数なしコンストラクタが在るかをご確認なさってください。 コメントをいただいて、 考え直したら思い切り間違っていることに気付きました。 お恥ずかしい。 間違ったものは「間違い回答」として残しつつ、 正しい回答を適宜、記載します。 ↓間違い回答 コンストラクタとはクラスをインスタンス化するときに実行される、 クラス名と同じ名前のメソッドのことです。 質問者様のコードでの下記の箇所でEmpty()が実行されることになっています。 ``` Empty e=new Empty(); ``` しかし、 `class Empty`の定義にコンストラクタが定義されていないためエラーが発生しています。 修正するなら下記の様になります。 ``` //一つ目のクラスEmpty.java public class Empty { public Empty() { /* コンストラクタはクラス名と同名、 戻り値もクラスがそのまま返されるになるので記載しません */ /* 何か初期化処理 */ } } ``` 以上、 ご参考になりますでしょうか?