戻り値
日本語 | 戻り値 |
英語 | return value |
ふりがな | もどりち |
フリガナ | モドリチ |
メソッドが返すことのできるたったひとつの値。
メソッドは、そのメソッドから抜ける際に値をひとつだけ呼び出し元に返すことができる。この値が「戻り値」である。「返り値」とも言う。
メソッドはreturnを使用してメソッドから抜けると同時に値を返すことができる。
値の型はメソッドの宣言で「戻り値の型 メソッド名( 引数 )」の形式で指定する。戻り値を返さない場合にはvoidを指定する。
戻り値は、「メソッドの呼び出し箇所が戻り値に置き換わる」と考えると分かりやすい。
「int result = returnInt();」の「returnInt()」メソッドが「100」を返すのであれば、呼び出し後に「int result = 100;」と置き換わったと考えると分かりやすい。
戻り値の型がクラスの場合、その戻り値を使用してメソッドを呼び出すことがある。そういった複雑なプログラムを読み解く場合、このように「置き換わる」と考えて読むと分かりやすいだろう。
戻り値は値をひとつしか返すことができず、さらに型も決められている。
戻り値から複数の値を返すことはできない。複数の値を返したい場合、その複数の値をフィールドとして持つクラスを定義し、そのクラスを戻り値の型として指定し、メソッドではそのクラスのインスタンスへの参照をreturnで返すことで、複数の値を返すことができる。
その他の方法としては、戻り値を使用せず、引数としてクラスのインスタンスへの参照を受け取り、そのクラスに格納するという方法もある。
C言語やC++言語ではよく使われる方法だが、Javaでは滅多に使用されない。
「複数の値を返すメソッド」を作るのは、面倒である。かといって、ArrayListやHashMapを使用して複数の値を返すのは言語同断である。
設計上の理想論を言えば、メソッドの戻り値から複数の値を返す場合、「その複数の値を持つクラス」が存在し、それを返すべきである。もしその複数の値がお互いに全く関係ないのであれば、その全く関係ない複数の値を返すようなメソッドは意味的に問題があると言える。
メソッドは、そのメソッドから抜ける際に値をひとつだけ呼び出し元に返すことができる。この値が「戻り値」である。「返り値」とも言う。
メソッドはreturnを使用してメソッドから抜けると同時に値を返すことができる。
値の型はメソッドの宣言で「戻り値の型 メソッド名( 引数 )」の形式で指定する。戻り値を返さない場合にはvoidを指定する。
戻り値は、「メソッドの呼び出し箇所が戻り値に置き換わる」と考えると分かりやすい。
「int result = returnInt();」の「returnInt()」メソッドが「100」を返すのであれば、呼び出し後に「int result = 100;」と置き換わったと考えると分かりやすい。
戻り値の型がクラスの場合、その戻り値を使用してメソッドを呼び出すことがある。そういった複雑なプログラムを読み解く場合、このように「置き換わる」と考えて読むと分かりやすいだろう。
戻り値は値をひとつしか返すことができず、さらに型も決められている。
戻り値から複数の値を返すことはできない。複数の値を返したい場合、その複数の値をフィールドとして持つクラスを定義し、そのクラスを戻り値の型として指定し、メソッドではそのクラスのインスタンスへの参照をreturnで返すことで、複数の値を返すことができる。
その他の方法としては、戻り値を使用せず、引数としてクラスのインスタンスへの参照を受け取り、そのクラスに格納するという方法もある。
C言語やC++言語ではよく使われる方法だが、Javaでは滅多に使用されない。
「複数の値を返すメソッド」を作るのは、面倒である。かといって、ArrayListやHashMapを使用して複数の値を返すのは言語同断である。
設計上の理想論を言えば、メソッドの戻り値から複数の値を返す場合、「その複数の値を持つクラス」が存在し、それを返すべきである。もしその複数の値がお互いに全く関係ないのであれば、その全く関係ない複数の値を返すようなメソッドは意味的に問題があると言える。
参考サイト
- (参考サイトはありません)
// Sample.java
public class Sample
{
public static void main( String[] args )
{
Sample sample = new Sample();
// returnInt()メソッドを呼び出します。
int result = sample.returnInt();
System.out.println( result );
// 100
// resultには、returnInt()メソッド内のローカル変数i中に
// 格納されていた値100のコピーが格納されました。
// この値が「戻り値」になります。
// 戻り値は「メソッドを戻り値の値に置き換える」と考えると
// 分かりやすいでしょう。
// たとえば、以下のような複雑な処理の場合。
int hashcode = Integer.valueOf( "100" ).toString().hashCode();
// 左から見ていきます。まず「Integer.valueOf( "100" )」が
// 呼び出され、戻り値としてIntegerクラスの参照が返されます。
// int hashcode = 「Integerクラスの参照」.toString().hashCode();
// 次に『「Integerクラスの参照」.toString()』を呼び出します。
// 戻り値としてStringクラスの参照が返されます。
// int hashcode = 「Stringクラスの参照」.hashCode();
// 最後に『「Stringクラスの参照」.hashCode()』が呼び出され、
// ハッシュ値が戻り値として返されます。
// int hashcode = ハッシュ値;
// このハッシュ値が代入される、というわけです。
// このように、戻り値からメソッドが呼び出されている場合には、
// 「メソッドの呼び出し部分が戻り値の値に置き換わる」と考えると
// 分かりやすいでしょう。
// 戻り値を返さないメソッドを呼び出す場合は、戻り値を受け取りません。
// 戻り値を返さない、notReturn()メソッドを呼び出します。
sample.notReturn();
// Sample#notReturn()
// むしろ受け取るとコンパイルエラーになります。
// ※コンパイルエラーの例
// Object object = sample.notReturn();
// ※エラーメッセージ
// 型の不一致: void から Object には変換できません。
// ※コンパイルエラーの例ここまで
// 複数の値を戻り値から返す方法。
Data data = sample.returnData();
System.out.println( data.number );
System.out.println( data.name );
// 200
// あいうえお
// このように、クラスのインスタンスへの参照を戻り値として
// 返してもらえば、複数の値を受け取ることができます。
}
/**
* 戻り値の型がintのメソッド。
*/
private int returnInt()
{
int i = 100;
// returnで戻り値を返します。
return i;
// あくまで、iの中身をコピーして返しています。
// iそのものを返しているわけではないので注意してください。
// 全然関係ない型を返すことはできません。
// ※コンパイルエラーの例
// return "あいうえお";
// ※エラーメッセージ
// 型の不一致: String から int には変換できません。
// ※コンパイルエラーの例ここまで
}
/**
* 戻り値の型がvoidのメソッド。
*/
private void notReturn()
{
System.out.println( "Sample#notReturn()" );
// 戻り値を返す必要がない場合には、戻り値の型をvoidにしましょう。
// そうすれば戻り値を返さなくて済みます。
}
/**
* 戻り値から複数の値を返す方法。
*/
private Data returnData()
{
// Dataクラスのインスタンスを作り、その中に値をセットします。
Data data = new Data();
data.number = 200;
data.name = "あいうえお";
// そして、そのインスタンスへの参照を戻り値として返します。
return data;
// 同じような事をArrayListやHashMapでもできますが、
// 絶対にしないようにしましょう。なぜなら、
// どんな型がセットされているのか、returnData()メソッドの
// 実装を見なければならないからです。
}
}
/**
* 複数のデータを持つクラス。
*/
class Data
{
// ※フィールドのアクセス修飾子をpublicにしていますが、
// 皆さんは礼儀正しくprivateにして、
// getter/setterを作ってください。
public int number;
public String name;
}
public class Sample
{
public static void main( String[] args )
{
Sample sample = new Sample();
// returnInt()メソッドを呼び出します。
int result = sample.returnInt();
System.out.println( result );
// 100
// resultには、returnInt()メソッド内のローカル変数i中に
// 格納されていた値100のコピーが格納されました。
// この値が「戻り値」になります。
// 戻り値は「メソッドを戻り値の値に置き換える」と考えると
// 分かりやすいでしょう。
// たとえば、以下のような複雑な処理の場合。
int hashcode = Integer.valueOf( "100" ).toString().hashCode();
// 左から見ていきます。まず「Integer.valueOf( "100" )」が
// 呼び出され、戻り値としてIntegerクラスの参照が返されます。
// int hashcode = 「Integerクラスの参照」.toString().hashCode();
// 次に『「Integerクラスの参照」.toString()』を呼び出します。
// 戻り値としてStringクラスの参照が返されます。
// int hashcode = 「Stringクラスの参照」.hashCode();
// 最後に『「Stringクラスの参照」.hashCode()』が呼び出され、
// ハッシュ値が戻り値として返されます。
// int hashcode = ハッシュ値;
// このハッシュ値が代入される、というわけです。
// このように、戻り値からメソッドが呼び出されている場合には、
// 「メソッドの呼び出し部分が戻り値の値に置き換わる」と考えると
// 分かりやすいでしょう。
// 戻り値を返さないメソッドを呼び出す場合は、戻り値を受け取りません。
// 戻り値を返さない、notReturn()メソッドを呼び出します。
sample.notReturn();
// Sample#notReturn()
// むしろ受け取るとコンパイルエラーになります。
// ※コンパイルエラーの例
// Object object = sample.notReturn();
// ※エラーメッセージ
// 型の不一致: void から Object には変換できません。
// ※コンパイルエラーの例ここまで
// 複数の値を戻り値から返す方法。
Data data = sample.returnData();
System.out.println( data.number );
System.out.println( data.name );
// 200
// あいうえお
// このように、クラスのインスタンスへの参照を戻り値として
// 返してもらえば、複数の値を受け取ることができます。
}
/**
* 戻り値の型がintのメソッド。
*/
private int returnInt()
{
int i = 100;
// returnで戻り値を返します。
return i;
// あくまで、iの中身をコピーして返しています。
// iそのものを返しているわけではないので注意してください。
// 全然関係ない型を返すことはできません。
// ※コンパイルエラーの例
// return "あいうえお";
// ※エラーメッセージ
// 型の不一致: String から int には変換できません。
// ※コンパイルエラーの例ここまで
}
/**
* 戻り値の型がvoidのメソッド。
*/
private void notReturn()
{
System.out.println( "Sample#notReturn()" );
// 戻り値を返す必要がない場合には、戻り値の型をvoidにしましょう。
// そうすれば戻り値を返さなくて済みます。
}
/**
* 戻り値から複数の値を返す方法。
*/
private Data returnData()
{
// Dataクラスのインスタンスを作り、その中に値をセットします。
Data data = new Data();
data.number = 200;
data.name = "あいうえお";
// そして、そのインスタンスへの参照を戻り値として返します。
return data;
// 同じような事をArrayListやHashMapでもできますが、
// 絶対にしないようにしましょう。なぜなら、
// どんな型がセットされているのか、returnData()メソッドの
// 実装を見なければならないからです。
}
}
/**
* 複数のデータを持つクラス。
*/
class Data
{
// ※フィールドのアクセス修飾子をpublicにしていますが、
// 皆さんは礼儀正しくprivateにして、
// getter/setterを作ってください。
public int number;
public String name;
}
// Sample.java public class Sample { public static void main( String[] args ) { Sample sample = new Sample(); // returnInt()メソッドを呼び出します。 int result = sample.returnInt(); System.out.println( result ); // 100 // resultには、returnInt()メソッド内のローカル変数i中に // 格納されていた値100のコピーが格納されました。 // この値が「戻り値」になります。 // 戻り値は「メソッドを戻り値の値に置き換える」と考えると // 分かりやすいでしょう。 // たとえば、以下のような複雑な処理の場合。 int hashcode = Integer.valueOf( "100" ).toString().hashCode(); // 左から見ていきます。まず「Integer.valueOf( "100" )」が // 呼び出され、戻り値としてIntegerクラスの参照が返されます。 // int hashcode = 「Integerクラスの参照」.toString().hashCode(); // 次に『「Integerクラスの参照」.toString()』を呼び出します。 // 戻り値としてStringクラスの参照が返されます。 // int hashcode = 「Stringクラスの参照」.hashCode(); // 最後に『「Stringクラスの参照」.hashCode()』が呼び出され、 // ハッシュ値が戻り値として返されます。 // int hashcode = ハッシュ値; // このハッシュ値が代入される、というわけです。 // このように、戻り値からメソッドが呼び出されている場合には、 // 「メソッドの呼び出し部分が戻り値の値に置き換わる」と考えると // 分かりやすいでしょう。 // 戻り値を返さないメソッドを呼び出す場合は、戻り値を受け取りません。 // 戻り値を返さない、notReturn()メソッドを呼び出します。 sample.notReturn(); // Sample#notReturn() // むしろ受け取るとコンパイルエラーになります。 // ※コンパイルエラーの例 // Object object = sample.notReturn(); // ※エラーメッセージ // 型の不一致: void から Object には変換できません。 // ※コンパイルエラーの例ここまで // 複数の値を戻り値から返す方法。 Data data = sample.returnData(); System.out.println( data.number ); System.out.println( data.name ); // 200 // あいうえお // このように、クラスのインスタンスへの参照を戻り値として // 返してもらえば、複数の値を受け取ることができます。 } /** * 戻り値の型がintのメソッド。 */ private int returnInt() { int i = 100; // returnで戻り値を返します。 return i; // あくまで、iの中身をコピーして返しています。 // iそのものを返しているわけではないので注意してください。 // 全然関係ない型を返すことはできません。 // ※コンパイルエラーの例 // return "あいうえお"; // ※エラーメッセージ // 型の不一致: String から int には変換できません。 // ※コンパイルエラーの例ここまで } /** * 戻り値の型がvoidのメソッド。 */ private void notReturn() { System.out.println( "Sample#notReturn()" ); // 戻り値を返す必要がない場合には、戻り値の型をvoidにしましょう。 // そうすれば戻り値を返さなくて済みます。 } /** * 戻り値から複数の値を返す方法。 */ private Data returnData() { // Dataクラスのインスタンスを作り、その中に値をセットします。 Data data = new Data(); data.number = 200; data.name = "あいうえお"; // そして、そのインスタンスへの参照を戻り値として返します。 return data; // 同じような事をArrayListやHashMapでもできますが、 // 絶対にしないようにしましょう。なぜなら、 // どんな型がセットされているのか、returnData()メソッドの // 実装を見なければならないからです。 } } /** * 複数のデータを持つクラス。 */ class Data { // ※フィールドのアクセス修飾子をpublicにしていますが、 // 皆さんは礼儀正しくprivateにして、 // getter/setterを作ってください。 public int number; public String name; }
「解説」に含まれているページ
- &&演算子
- *演算子
- ++演算子
- +演算子
- --演算子
- -演算子
- /演算子
- <<演算子
- =演算子
- >>>演算子
- >>演算子
- @return
- abstract
- ArrayList
- boolean
- CharArrayReader
- clone
- Comparator
- compareTo
- concat
- Date
- doPost
- EOFException
- finalメソッド
- for
- getBytes
- getter
- HashMap
- HttpSession
- Iterator
- java.sql.Date
- long
- main
- new
- PrintStream
- PrintWriter
- privateメソッド
- protectedメソッド
- publicメソッド
- Reader
- ResultSet
- return
- SELECT
- setter
- staticメソッド
- static初期化子
- StringReader
- substring
- synchronizedメソッド
- Timestamp
- toString
- valueOf
- void
- ||演算子
- アサーション
- アンボクシング変換
- オーバーライド
- キャスト演算子
- クエリー
- コンストラクタ
- サーバー
- シグネチャー
- ソケット
- テストファースト
- バイト入力ストリーム
- プリペアードステートメント
- プリミティブ型
- メソッド
- メッセージボックス
- リフレクション
- 乱数
- 分割子
- 型
- 契約による設計
- 引数
- 戻り値
- 戻値
- 抽象クラス
- 抽象メソッド
- 文字入力ストリーム
- 文字列リテラル
- 演算子
- 行
- 返り値
- 返値
- 配列
- 関数