質問: Java Bronzeを取るために日々学習をしています。 問題集の内容で解説を見ても納得出来ないところがあったので質問させていただきます。 Marketクラスのコンストラクタの定義として有効なものはどれですか? 2つ選択してください。 A. public final Market (){} B. private static Market (){} C. public Market (String item){} D.private void Market (){} E. public Market (){} コンストラクタの定義が 修飾子 クラス名 (引数リスト) { 文; } 納得行ってないところは ・修飾子の後に final,static,voidが入るのは何故なのか ・voidには戻り値が無いのでメソッドとして扱われる、と調べたらでて来てこの問いに関係があるのか ・void以外のstatic,finalはどうなのだろうか この3点わかる方いましたらよろしくお願いします。 追記: 問題の回答 答えは C,E 解説には コンストラクタの条件を満たしているため、正解です。 と記述されています。 A,B,Dは ・コンストラクタの条件を満たしていない ・戻り値の型を宣言してしまっている ・修飾子が指定できない とあります。
回答: まず、Javaの場合、コンストラクタは**返り値を指定しない**ことで、他のメソッドと区別しています。そのため、戻り値を書いた瞬間にそれは「単なるメソッド」扱いとなって、コンストラクタではなくなります(言語によっては、「特定の名前を持ったメソッドをコンストラクタにする」という手法をとっていることもあります)。 そして、インスタンスを生成して初期化を行うものである以上、「`static`なコンストラクタ」も意味をなしません。そして、コンストラクタは通常のオーバーライドと別な枠組みで動く以上、`final`も意味をなしません。 ...と理屈付けはできるのですが、結果的に意味のない構文が残ってしまうようなこともありますし、最終的には**文法がどうなっているか**以上の意味はないことです。 StackOverflowの関連する質問