メソッドとは(復習)
- メソッドとはC言語の関数のような、「処理がまとめられたもの」である。
- メソッドはクラスの中に作られる。
- メソッドを実行するときに値を渡すことができる。その値のことを引数という。
- メソッド内では、引数以外にも、インスタンスにあるフィールドも使うことができる。もちろんメソッド内で作った変数も使える。
- メソッドの処理結果(値)を呼び出し元に返すことができる。その値を戻り値(返り値)という。
メソッドの例
Bodyクラスを題材にメソッドの実装例を見ていこう。実装したBodyの利用例も参照すること。
引数がなくて返り値がある
5 6 7 8 9 |
// BMIを計算するメソッド double getBmi() { double bmi = weight / (height * height); return bmi; } |
returnで返り値を指定する。
引数が1つで返り値がない
11 12 13 14 15 16 |
/** * 身長をセンチでセットするメソッド */ void setHeightAsCm(double cm) { height = cm / 100.0; } |
返り値がない場合は返り値の型の代わりに「void」と書く。
引数が2つで返り値がない
18 19 20 21 22 23 24 |
/** * 体重と身長を1度に設定するメソッド */ void setWeightAndHeight(double weight, double height) { this.weight = weight; this.height = height; } |
引数が複数の場合は「,」で区切る。
引数の名前がフィールドとかぶる場合、単にその名前を書くと引数の方が使われる。このような状況でフィールドの方を使うには「this.フィールド名」とする(教科書P.98)。
コンストラクタ
コンストラクタは「インスタンス化のときに実行されるメソッド」である。
例えば、これまではインスタンスを作成した後にフィールドに値を代入していたが、インスタンス化と同時に値を代入できるようなコンストラクタを定義してみよう。
26 27 28 29 30 31 32 33 |
/** * 引数が2つあるコンストラクタ */ Body(double weight, double height) { this.weight = weight; this.height = height; // setWeightAndHeight(double weight, double height) } |
コンストラクタの定義の注意点(普通のメソッドとの違い)は以下の2点。
- コンストラクタの名前はクラス名と同じにする。自由につけられるわけではない。言い換えると、クラス名と同じ名前のメソッドはコンストラクタである。
- コンストラクタには返り値がないので、返り値の型は記述しない。voidも書いてはいけない。
このコンストラクタを使ってインスタンスを作るには次のようにする。
14 15 |
Body jiro = new Body(80, 1.7); System.out.println("jiroのBMIは"+jiro.getBmi()+"です。"); |
ただし、この状態(コンストラクタを1つ定義した状態)でコンパイルしようとすると、Bodyクラスを呼び出しているクラス(Lesson03やLesson04)がエラーになってしまう。これは、「new Body()」に対応したコンストラクタが用意されていないからである。
「new Body()」に対応したコンストラクタも定義しよう。ここでは、乱数で身長と体重をセットすることにする。
35 36 37 38 39 40 41 |
/** * 引数がないコンストラクタ */ Body() { this.weight = 50.0 + Math.random() * 50.0; this.height = 1.5 + Math.random() * 0.5; } |
これで、「new Body()」も使えるようになった。
17 18 |
Body hanako = new Body(); System.out.println("hanakoのBMIは"+hanako.getBmi()+"です。"); |
そもそも、これまではなぜコンストラクタを定義していないのに「new Body()」でインスタンス化できていたのだろうか?それは、コンストラクタを1つも定義しない場合は、デフォルトコンストラクタという何もしないコンストラクタが生成されていたからである(教科書P.76)。デフォルトコンストラクタは、「コンストラクタを1つも記述しない場合」にだけ生成されることに注意すること。