メソッドとは
- クラスにはフィールドとメソッドがある
- フィールドは「情報」(変数のセット)(pointクラスのx,yの値)
- メソッドは「機能」(命令文のセット)(例えばpointクラスに「座標値を出力する機能」を追加できる)
クラスの中にフィールドとメソッドを記述します。これらはそれぞれ担当する内容が異なっています。フィールドの中には数値などの値の「情報」を記述し、これとは別に「機能的」なものはメソッドとしてクラスの中に記述します。メソッドの中には命令文を記述します。
図のpointクラスはx座標とy座標の値を持っているだけではなく、さらに座標値を出力させる機能も持っています。
メソッドの宣言
ではどのように機能を出力させるのかプログラムをみていきましょう。
クラスの構造
class クラス名 {
フィールドの宣言 //情報
メソッドの宣言 //機能
}
メソッドの宣言の仕方
void メソッド名() {
命令文
}
フィールドの書き方はひたすら変数の宣言(場合によっては代入)をします。
メソッドには頭にvoidを必ず記述します。そしてメソッド名のあとに()を記述します。
メソッドの例
命令文の中のthis.x←のthisとはどういう意味かというと、「今」のクラスの中の変数という意味です。pointPlaceというメソッドは同じPointクラスの中に存在しているので、this.xというのはPointクラスのフィールドに宣言されている、int x;←のxという変数のことを表しています。
ここまでが命令文になります。
この命令文は何を表しているかというと、このPointクラスの中のインスタンス変数の中身を文字列と合わせて出力するというのがこのメソッドの機能となります。
これはあくまでもクラスの中の定義になります。
このクラスを作っただけではプログラムは動きません。
mainクラスを設けてmainクラスの中にインスタンスを生成してメソッドを呼び出さないと実行できません。
どのように使用するか、簡単な例を挙げます
メソッドの使用例
まずPointクラスのインスタンスを生成してpの変数(x,y)に情報を代入します。
そして p.pointPlace();←でメソッドの呼び出しをおこないます。
クラスの中に機能を設けて p.pointPlace();で実行します。
出力結果は 座標値は(10,5)です。 となります。
this.x はp.xに代入された 10がそのまま出力されています。(yも同様)
p .pointPlace() でメソッドの呼び出しがされています。
メソッド呼び出し処理の流れ
①で何らかの処理をされてメソッドが呼び出されます。メソッド自体はインスタンスの中のメソッドで処理をされます。インスタンスの中でメソッドが呼び出されて②の処理をされます。処理し終えたら、メインの呼び出し側に戻って次の処理をする。という流れになります。
メソッドの引数と戻り値
- メソッドは命令文のセット
- 引数
- メソッドには命令を実行するときに値を渡すことができる。この値を「引数」と呼ぶ
- 戻り値
- メソッドは命令を実行した結果の値を呼び出し元に戻すことができる。この値を「戻り値」と呼ぶ
メソッドには命令を実行する際に値を渡すことが可能です。この値を使って何らかの処理をするよう命令をします。この値のことを「引数」といいます。
例えばターミナル上で数字や文字などを渡して次のプログラムを実行する命令をするコマンドライン引数なども同様です。
「戻り値」というのは、メソッドを実行したその実行結果のことをいいます。この「戻り値」を次の処理に使うこともできます。
図で示すと②の処理で何らかの結果を受け取って、その「戻り値」を使って③で処理をする。という流れになります。
引数のあるメソッド
メソッドが呼び出されインスタンスに引数を渡すときは、なんらかの値として渡します。その渡された値を使って②で処理をおこないます。
void メソッド名(型 変数名){
命令文
}
void メソッド名()←引数がない場合は空でしたが、型と変数名を入れます。int型やstring型などの基本型以外に、参照型の変数を入れることもできます。
引数のあるメソッドの例
引数の受け渡しにはメソッド名の後ろの()を使用する
メソッド名は好きな名前をつけてかまいませんが、一応multiplyは掛け算という意味です。
this.x *= n;
このthisというのは、Pointクラスのint x; のことです。
*= の意味は乗算代入のことです。掛け算して代入します。
もともとのxをnで掛けて、値をxに代入しなおすということです。(yも同様)
呼び出し側についてはまずインスタンスを生成して情報の代入をする
p.multiplyでmultiplyメソッドの呼び出しをおこないます。
今度はただ呼び出すのではなく、()←の中に引数を提示してから呼び出します。
この引数の数字は「2」なのでnを2倍することになります。
xとyの値をそれぞれ2倍して、処理をするということです。
したがって pのxは、10×2なので
20を代入しなおすので、xの値は20となります。(yの値は10)
実行結果は
となります。
複数の引数のあるメソッドの例
引数は複数呼び出すこともできます。
それぞれの変数xとyに引数を加えて代入しなおします。
実行結果は
となります。
戻り値のあるメソッド
図の②のメソッドの処理でなんらかの計算をさせて、その計算結果を呼び出し側に戻してそれを利用することができます。
この戻す値のことを「戻り値」といいます。
メソッドの書き方
戻り値の型 メソッド名 (引数列) {
命令文
return 戻り値 ;
}
これまで使ってきたvoidの代わりに戻り値の型を記述します。
このvoidというのは戻り値がないという意味です。
戻り値の型は、例えばint,string,double,booleanなどです。
命令文の中には、この値を戻しますという意味のreturnを必ず記述します。
戻り値のあるメソッドの例
- 戻り値を使った値を戻すようにする
- 戻り値は1つだけ
- 戻り値の型をメソッド名の前に記述する
returnの後ろに処理を記述します。
this.x * this.y
は、xとyを掛けた結果を戻すという意味です。
呼び出し側には
int xy = p.getXY();
と記述します。これは
pのgetXYというメソッドを呼び出します。という意味です。
そしてその結果(xとyを掛けた結果の値)をint型の整数(xy)として受け取ります。
実行結果
pのgetXYというメソッドを呼び出した時点で
変数xyには50という数値が入っています。
このという数字はどこから来たかというとgetXYというメソッドで処理された結果です。
引数と戻り値のあるメソッド
- 引数と戻り値の両方を持たせることができる
- 参照型(の変数)を引数にすることもできる
Sameメソッドの機能は「2つの点が同じかどうか」の真偽を確認するものです。
YesかNoかを確かめるメソッドなのでboolean型のメソッドとなります。
これまでは基本型の引数を扱ってきましたが、このSameメソッドの引数は「参照型」の変数になります。
つまりPointクラスの変数pそのものを引数とします。
if文の条件は
this.xとp.x、かつthis.yとp.yが等しいかどうかを確認するというものです。
this.x←のxは同じPointクラスの中の変数int xを指します。
p.x←のxはインスタンス化されてpの中に情報を代入したpの中のxのことを指します。(yも同様)
呼び出し側は
p1という変数にインスタンスを生成してxとyに数字を代入します。そして2つの値を比べるので
p2というインスタンスも生成して数字を代入します。
if (p1. Same (p2) )
if文の中でメソッドを呼び出します。p1のSameメソッドを呼び出して引数としてp2を代入します。
Sameメソッドを呼び出した後、PointクラスのSameメソッドの処理が始まります。
この時点でのSameメソッドの処理
this.x←のxは呼び出し側のxであるp1を指します。
boolean Same (Point p) ←の引数でpを指定していますが、この引数pは呼び出し側の引数p2のことを指します。
実行結果
メソッドのまとめ
引数なし 戻り値なし
void メソッド名 () {
命令文
}
引数あり 戻り値なし
void メソッド名 (型 変数名) {
命令文
}
引数なし 戻り値あり
戻り値の型 メソッド名 (型 変数名) {
命令文
return 戻り値 ;
}
論理演算式の値
論理演算式はコンパクトにまとめることもできます。
if (this.x == p.x && this.y == p.y) {
return true;
} else {
return false ;
}
⇓⇓
⇓⇓