そんなに強いプログラマーではありませんが、自分の認識を共有させていただきます。
※一度編集途中で誤投稿してしまいました。すいません。
パターン1, 2
voidは、メソッドの戻り値が無いことを表し、
メソッドの仕様として、戻り値を返す場合には、voidではなく、返す戻り値の型を記述する必要があります。
そういう仕様です。
returnなしならvoid型だという判断のほうがよく見かける理由
は、
メソッドにreturnと記述がないということは、
そのメソッドでは戻り値が必要ない、
つまり、メソッドの戻り値の部分に記述すべきはvoidだ!
という流れで、そのような書き方になったのかな?と考えます。
しかし、そもそも戻り値は先に決めておくものだと思いますし、メソッドの内容を書いてから、return文が無いからvoidだな!としてしまうのではなく、
こんな処理をするメソッドが欲しい=>処理の結果を戻り値として取得するのに適切な型はこれだ!
という流れでメソッドの戻り値を決めるのが普通かな?と思います。
その結果として、戻り値が必要ない場合に、voidになるのです。
パターン3
戻り値がvoid以外のメソッド内では、
のような記述をしますが、戻り値がvoidのメソッド内でreturn文が記述されているとき、
という記述になっていると思います。
これは、何も返していない(無(void)を戻り値にしている)ということです。たぶん。
何も返さないのに、何でreturnと書くんだ!と思いませんか?はじめは自分もそう思いました。
なぜこのような記述をするのかというと、returnには戻り値を返すはたらきの他に、メソッドの処理を終了するというはたらきがあるためです。
これにより、場合によって以降の処理が不要になる場合、以降の処理をせずに値を返す、といったようなことが可能になります。
これを利用して、
java
1//漢字とひらがなの対応付け
2private String[][] data = {
3 {
4 "法華",
5 "冨賀",
6 "秘誉"
7 },
8 {
9 "ほげ",
10 "ふが",
11 "ぴよ",
12 }
13};
14
15//該当する漢字があった場合、それに対応したひらがなの値を返す
16public String getKana(String val){
17 //漢字を順番に見ていく
18 for(int i = 0; i < data[0].length; i++){
19 //valと同じなら
20 if(data[0][i].equals(val))
21 return data[1][i];//対応するひらがなを返す
22 }
23 return null;
24}
のようなことができます。
また、returnの直後に何らかの処理をさせようとしても、メソッドの処理は終了しているため、無意味な記述だとしてコンパイルエラーを起こします。たぶん。
つまり、
java
1public void printHogeHoge(){
2 System.out.println("hoge");
3 System.out.println("hoge");
4 return;
5}
は大丈夫でも、
java
1public void printHogeHoge(){
2 System.out.println("hoge");
3 return;
4 System.out.println("hoge");
5}
はダメです。仮に実行できたとしても、二度目のhogeが出力できません。returnでメソッドの処理が終わっているからです。
ちなみに、戻り値が無い場合でも、
return;
とすればreturn文は使用できます。
また、以下の場合では、returnがメソッドの途中にあっても許されます。
java
1//strを出力する。
2public void printStr(String str){
3 //nullなら何もしない
4 if(str == null){
5 return;
6 }
7 //strを出力
8 System.out.println(str);
9}
なぜ許されるかというと、strがnullでないときは普通にstrが出力されますし、if文のブロック内ではreturn文以降に処理を書いていないからです。
パターン4
コンストラクタを、voidもreturnも無いメソッドだと認識しているようですが、あれはクラスのインスタンス作成時に呼ばれる特別なメソッドで、戻り値部分の記述が存在しないのは仕様です。
なぜ戻り値部分の記述ができないのかというと、おそらく、インスタンスを作るメソッドなので、戻り値を定義する必要性が無いからだと思います。
また、return文を内部で使うことはできます。
ですが、ほとんどの場合、コンストラクタでそこまで複雑な処理をする必要が無く、引数のメンバ変数への代入などだけで済ませるため、あまり内部でreturn文を見ることはないのだと思います。
###よく、関数から値を返すのがreturnとありますが、「返す」とはなんでしょうか。println()処理やsetText()のような処理で引数に"hoge"を渡したらhogeと「返ってくる」という意味とはなぜ違うのですか。
あれは、値が返ってきているのではなく、出力されているだけです。
値が返されている場合、メソッドの戻り値の型はvoidではなく、メソッド内でreturn 〇〇; のように値が返されており、また、
java
1int i = Integer.parseInt(256);
のように、値を取得できます。setText()やprintln()ではこれができません。これらのメソッドでは、目に見える形に表示する処理を内部で行っていますが、戻り値はありません。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/03/03 03:20