質問者は、少し誤解されているようです。
http://www.y-adagio.com/public/standards/tr_javalang/index.h...
Java言語では
・コンストラクタ:「必ず型指定しない」
・メソッド:「必ず型指定が必要」
となっており、一貫性があります。
型が指定されているコンストラクタは存在しないし
逆に型が指定されていないメソッドも存在しません。
「コンストラクタには戻り値がなく,戻り値の型指定をすると一般メソッドとして取り扱われる」
というのは、単に
「クラスやコンストラクタと同じ名称のメソッドを定義できます」
と言い換えることができる。
よって、たまたまクラス、コンストラクタ、メソッドの名称が
全く同じだったとしても、それぞれ異なる役割を果たします。
下記は名称が"Sample"だった場合の例です。
public class Sample {
/** 表示する文言 */
private String words_;
/** メインメソッド */
public static void main(String[] args) {
//コンストラクタによって、インスタンス初期化
Sample sample = new Sample();
//メソッドによって、処理を実行
sample.Sample();
}
/** コンストラクタ */
public Sample() {
words_ = "This is Sample !";
}
/** メソッド */
public void Sample() {
System.out.println(words_);
}
}
http://javafaq.jp/S002.html#S002-01
mainメソッドに戻り値がないことを表すためにvoidを指定します。
public static void main(String[] args)
void以外を指定すればオーバーロードした別のメソッドなので起動時に呼ばれることはなくなります。
ありがとうございました。mainメソッドとコンストラクタでは使い方はまったく違いますが,「必ずvoid指定する」メソッドと「必ず型指定しない」メソッドとする理由が思いつかず,言語規定に一貫性が無いように思うのですが。。。
http://www2.ocn.ne.jp/~notes/java/java17.html
ええと、まず「コンストラクタ」は「メソッド」ではありません。
「コンストラクタ」はクラスの初期化を担っています。
単にそれだけでしかありません。なぜそうなっているかといえば、
オブジェクト指向を言語仕様から実装しようとしたからだと
思えばいいのでは。「コンストラクタ」の動作としては正しいかと思います。
コンストラクタの戻り値は絶対に「その」クラスしか
ありえませんから。
ただし、main()メソッド(これは単なるメソッド)はオブジェクト指向からすると不思議なメソッドになってしまうので混乱するのでしょう。
main()メソットだけが例外だと考えればいいです。
よくでてくる関数が例外になるの?と思うでしょうが、、
Javaを使用していくと、あまりmain()使いませんので
気にしなかったりします。
ということで回答としては
と思ったほうがいいと思います。
ありがとうございました。「そのようになっている」と思うしかないんでしょうね。
すみませんが、明確な回答ではなくて質問の整理をさせてもらいます。
public class Object1 { public Object1() { System.out.println("これはコンストラクタ"); } public void Object1() { System.out.println("これはメソッド"); } public static void main(String[] args) { Object1 o = new Object1(); o.Object1(); } }
のソースで、実行結果が
これはコンストラクタ これはメソッド
となる。
つまり、Object1 クラス中で、
という仕様に気持ち悪さが残る、ということですね(public かどうかは今回の話とは無関係です)。
特に触れられてませんが、型指定の無いクラス名と異なるメソッド宣言はコンパイラでエラーになるのは当然、ということでいいですね。
「クラス名と同名で型指定のないメソッド」がコンストラクタとなるのはC++から譲り受けた仕様でしょう。
http://www.bohyoh.com/CandCPP/FAQ/FAQ00084.html
「main メソッドor関数 がvoid」なのは古い(ANSI Cより前の)C言語から譲りうけた仕様でしょう。
http://homepage3.nifty.com/aokura/phoebe/minitips.html#3
http://www.cmagazine.jp/q/old.html#index4
ということで……私では「Java以前の言語から譲り受けているのだろう」という程度の説明しかできません。
C++がコンストラクタを「クラス名と同名で型指定のないメソッド」とした理由はどこかからでてくるかもしれませんが……。すみません。
ありがとうございました。「手続き文」には必ず実行結果=戻り値があるという思い込みは捨てないといけませんね。
質問者は、少し誤解されているようです。
http://www.y-adagio.com/public/standards/tr_javalang/index.h...
Java言語では
・コンストラクタ:「必ず型指定しない」
・メソッド:「必ず型指定が必要」
となっており、一貫性があります。
型が指定されているコンストラクタは存在しないし
逆に型が指定されていないメソッドも存在しません。
「コンストラクタには戻り値がなく,戻り値の型指定をすると一般メソッドとして取り扱われる」
というのは、単に
「クラスやコンストラクタと同じ名称のメソッドを定義できます」
と言い換えることができる。
よって、たまたまクラス、コンストラクタ、メソッドの名称が
全く同じだったとしても、それぞれ異なる役割を果たします。
下記は名称が"Sample"だった場合の例です。
public class Sample {
/** 表示する文言 */
private String words_;
/** メインメソッド */
public static void main(String[] args) {
//コンストラクタによって、インスタンス初期化
Sample sample = new Sample();
//メソッドによって、処理を実行
sample.Sample();
}
/** コンストラクタ */
public Sample() {
words_ = "This is Sample !";
}
/** メソッド */
public void Sample() {
System.out.println(words_);
}
}
なるほど!確かに誤解をしておりました。メソッドは型指定を省略すればintかvoidになるのかと思っていました(必ず型指定をしていたので気づきませんでした)。型指定が有るか無いかで厳密に違うのですね。
コンストラクタでないメソッドは戻り値を定義しておかないといけません。戻り値がないなら void で。
「必ずvoid指定する」メソッドというよりも、その戻り値を書かないといけないメソッドの中でも、特に public static void main(String[] args) が起動時に呼ばれることになっているだけだと思います。
一方、コンストラクタは戻り値はありませんが、 void を書きません。逆にいうと何も戻り値を書いていないものがコンストラクタです。
コンストラクタは必ずクラスメイト同じ名前になりますが、それとは別に戻り値の void な、クラス名と同じメソッド(コンストラクタでない)を定義できることからも、戻り値を書かないのが、コンストラクタである方がわかりやすいと思います。
ありがとうございました。メソッドは型指定を省略すればintかvoidになるのかと勘違いしていました。
なるほど!確かに誤解をしておりました。メソッドは型指定を省略すればintかvoidになるのかと思っていました(必ず型指定をしていたので気づきませんでした)。型指定が有るか無いかで厳密に違うのですね。