人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

(java)「mainメソッドには戻り値がないが,void指定しないと仮想計算機にロードされない」のに「コンストラクタには戻り値がなく,戻り値の型指定をすると一般メソッドとして取り扱われる」規定になっているのはなぜでしょうか。「必ずvoid指定する」か「必ず型指定しない」のどちらかに統一してくれれば余計なことを覚えなくて済むのに。。。初学者なので表現に誤りがあるかもしれませんが,間違ってvoidを打ち込んで原因不明となることがよくあるので,よろしくお願いします。

●質問者: ryo-blackcomb
●カテゴリ:コンピュータ 学習・教育
✍キーワード:Java void コンストラクタ メソッド 学者
○ 状態 :終了
└ 回答数 : 6/6件

▽最新の回答へ

1 ● たーちゃん
●30ポイント

http://javafaq.jp/S002.html#S002-01

mainメソッドに戻り値がないことを表すためにvoidを指定します。

public static void main(String[] args)

void以外を指定すればオーバーロードした別のメソッドなので起動時に呼ばれることはなくなります。

◎質問者からの返答

ありがとうございました。mainメソッドとコンストラクタでは使い方はまったく違いますが,「必ずvoid指定する」メソッドと「必ず型指定しない」メソッドとする理由が思いつかず,言語規定に一貫性が無いように思うのですが。。。


2 ● ma-kanoh
●30ポイント

http://www2.ocn.ne.jp/~notes/java/java17.html

ええと、まず「コンストラクタ」は「メソッド」ではありません。

「コンストラクタ」はクラスの初期化を担っています。

単にそれだけでしかありません。なぜそうなっているかといえば、

オブジェクト指向を言語仕様から実装しようとしたからだと

思えばいいのでは。「コンストラクタ」の動作としては正しいかと思います。

コンストラクタの戻り値は絶対に「その」クラスしか

ありえませんから。

ただし、main()メソッド(これは単なるメソッド)はオブジェクト指向からすると不思議なメソッドになってしまうので混乱するのでしょう。

main()メソットだけが例外だと考えればいいです。

よくでてくる関数が例外になるの?と思うでしょうが、、

Javaを使用していくと、あまりmain()使いませんので

気にしなかったりします。

ということで回答としては

と思ったほうがいいと思います。

◎質問者からの返答

ありがとうございました。「そのようになっている」と思うしかないんでしょうね。


3 ● quintia
●30ポイント

すみませんが、明確な回答ではなくて質問の整理をさせてもらいます。

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++がコンストラクタを「クラス名と同名で型指定のないメソッド」とした理由はどこかからでてくるかもしれませんが……。すみません。

◎質問者からの返答

ありがとうございました。「手続き文」には必ず実行結果=戻り値があるという思い込みは捨てないといけませんね。


4 ● kishiro
●100ポイント ベストアンサー

質問者は、少し誤解されているようです。

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になるのかと思っていました(必ず型指定をしていたので気づきませんでした)。型指定が有るか無いかで厳密に違うのですね。


5 ● noko-noko
●30ポイント

Java 入門 | コンストラクタ


コンストラクタでないメソッドは戻り値を定義しておかないといけません。戻り値がないなら void で。

「必ずvoid指定する」メソッドというよりも、その戻り値を書かないといけないメソッドの中でも、特に public static void main(String[] args) が起動時に呼ばれることになっているだけだと思います。


一方、コンストラクタは戻り値はありませんが、 void を書きません。逆にいうと何も戻り値を書いていないものがコンストラクタです。

コンストラクタは必ずクラスメイト同じ名前になりますが、それとは別に戻り値の void な、クラス名と同じメソッド(コンストラクタでない)を定義できることからも、戻り値を書かないのが、コンストラクタである方がわかりやすいと思います。

◎質問者からの返答

ありがとうございました。メソッドは型指定を省略すればintかvoidになるのかと勘違いしていました。


1-5件表示/6件
4.前の5件|次5件6.
関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ