戻る
メソッドの定義
これまで作成してきたアプリケーションは、mainという名前のただ1つのメソッドしか使ってこなかった。
これから1つの;クラスの中に複数のメソッドを定義し、それを利用する方法を説明する。
複数のメソッドを定義する
まずは、mainメソッドの定義から復習する。mainメソッドは、次のように書いてきた。
public static void main(String[ ] args)
{
文1
文2
…
}
mainメソッドはこのように定義する。他のメソッドについても同様である。次のように定義する事ができる。
public static void メソッド名 ( ) { ・・・下線部にメソッドの名前を書く。
文1
文2
…
}
ここで注意したいのがメソッドの後ろの(
)である。
mainメソッドの場合は( )の中にString[
] argsを書いたが、ここでは( )の中を空にしている。
メソッド名の後ろの( )の中には、そのメソッドが受け取る引数を書く。
しかし、しばらくは引数を取らないメソッドを書いていくので、その間は(
)の中を空のままにしておく。「
空の( )は、そのメソッドが引数を取らない事を意味している。
次にbeerという名前のメソッド定義例を示す。
public static void beer ( ) {
文1
文2
…
}
次はmain以外にbeer、wineの合計3つのメソッドを定義したサンプルアプリケーションである。
各メソッドは、自分のメソッド名を表示するようにプログラムされている。
サンプル:Beer.java
//
//Beer.java---複数のメソッドを定義する
//
public class Beer {
public static void beer( ) { ・・・・・・・・・・・・・・・・メソッド1:beerの定義
System.out.println("method:
beer");
}
public static void wine( ){ ・・・・・・・・・・・・・・・・・メソッド2:wineの定義
System.out.println("method:
wine");
}
public static void main(String[ ]
args) { ・・・・・・メソッド3:mainの定義
System.out.println("method:
main)";
}
}
実行例
$ java Beer
method: main
$ _
この実行例を見ると、mainメソッドに書かれた文だけが実行されているのが分かる。
他のメソッドに書かれた文は、全く実行されていない。mainメソッド以外のメソッドを実行する方法については、次に説明する。
メソッドを置く順序
1つのクラスの中に複数のメソッドを定義する場合、メソッドを並べる順序は自由である。
例えば、上記のアプリケーションでは、beer、wine、mainの順で並べたが、main、wine、beerの順に並べる事も出来る。
メソッドをどのような順序で並べようと、アプリケーションはmainの最初の文から実行される。
メソッドは、定義しただけでは実行されない。メソッドを実行するには、実行するように指示を与えなければならない。
定義したメソッドを実行する事を、メソッドを呼び出すとかメソッドを参照するという。
具体的には、参照するメソッドの名前に(
)を付け、最後にセミコロンを付ければよい。
メソッド名;
例えばメソッドbeerを実行するなら次のようにする。
beer( );
また、メソッドwineを実行するなら次のようにする。
wine( );
次に、先程は実行出来なかったメソッドの参照を追加して、beerやwineを実行出来るようにしたものを示す。
サンプル:Beer_2.java
//
//Beer_2.java---定義したメソッドを参照する。
//
public class Beer_2 {
public static void beer( ) {
System.out.println("method:
beer");
}
public static void wine( ) {
System.out.println("method:
wine");
}
public static void main(String[ ]
args) {
System.out.println("method:
main");
beer( ); ・・・・・メソッドの参照を追加
wine( );
}
}
次に書き換えたサンプルの実行例を示す。
$ java Beer_2
method: main
method: beer
method: wine
$ _
引数
これまでのメソッドでは、引数を使ってこなかった。これからメソッドの引数について説明する。
引数を使う事で、メソッドの呼び出し側からメソッドに対してデータを送信する事が出来る。
仮引数の定義
メソッドを参照する時、メソッドに対して引数を渡す事が出来る。
その為には、メソッドを定義する時、一緒に仮引数を定義する必要がある。
仮引数というのは名前の通り、仮の引数である。本当の引数は、そのメソッドを呼び出す時に指定され、
その本物のの引数の値が仮引数に代入される。メソッドの本体では、仮引数を普通の変数のように使う事が出来る。
仮引数は、メソッド名の後ろの( )の中で定義する。
public static void メソッド名(仮引数の定義) 下線部にて設定
{
文
…
}
仮引数の定義は、次のように仮引数の型と名前を組にして指定する。
型 仮引数名
次に例を示す。この例では、nvalというint型の仮引数を定義している。
public static void func(int nval)
複数の仮引数が必要な場合は、仮引数をカンマで区切って並べる。
型 仮引数名, 型 仮引数名, ……
例えば次のメソッドfuncは、int型の仮引数
n とfloat型の仮引数valを定義している。
public static void func(int n,float
val)
引数つきメソッドの参照
引数が定義されているメソッドを呼び出すときは、次のように引数をカンマで区切って並べる。
メソッド名(引数1, 引数2, ……);
例えば先のメソッドfuncを呼び出す時は、次のようにする。
func(10, 2.718282);
ここで指定した引数10や2.718282を仮引数に対して実引数という。指定された実引数は、メソッドfuncの仮引数に代入される。
n = 10;
val = 2.718282;
つまり、メソッドを呼び出す側の第1引数10がメソッド定義側の第1仮引数nに代入され、
第2引数の2.718282が定義側の第2仮引数に代入される。
呼び出し側: func(10,2.718282); ・・・・・・・・・・・・・・・実引数
↓代入される
受け取り側: void func(int n, float
val) ・・・・・・・・・・仮引数
引数つきのメソッドの例として、min〜maxまでの整数の合計を計算して表示するメソッドを作成する。
public static void min_max(int min,
int max) {
//ここでmin〜maxまで整数の合計を計算して表示する。
}
min〜maxまでの合計は、次のようにして計算する事が出来る。
(max * (max + 1) - min * (min - 1))
/ 2
したがってメソッドmin〜maxは、次のようになる。
public static void min_max(int min,
int max) {
System.out.println((max * (max +
1) - min * (min - 1)) /2);
}
このメソッドmin_maxを利用するには次のようにする。
min_max(1,10); ・・・・・・・・・・1〜10までの合計を表示する
min_max(1000,2000); ・・・・・1000〜2000までの合計を表示する
以上をテストする為のサンプル
//
//Min_Max.java---min〜maxまでの合計を表示する
//
public class Min_Max {
public static void min_max(int min,
int max) {
System.out.println((max * (max
+ 1) - min * (min -1)) / 2);
}
public static void main(String[ ]
args) {
System.out.print("1〜10までの合計=");
min_max(1,10);
System.out.print("1000〜2000までの合計=");
min_max(1000,2000);
}
}
この中では、printという新しい使い方が出てきている。printはprintlnとほとんど同じである。ただし、最後に改行を出力しない。
println ・・・・・文字列を出力した後、改行する。
print ・・・・・・文字列を出力した後、改行しない。
実行例
$ java Min_Max
1〜10までの合計= 55
1000〜2000までの合計= 1501500
$ _
メソッドの値
これまでメソッドの定義を次のようにしてきた。
public static void メソッド名(引数)
{
文1
文2
…
}
このうちメソッド名の前につけるpublicとかstaticとかvoidについては、意図的に説明を避けてきた。
今回は、これらのうちvoidの部分について説明する。
メソッドを途中で抜ける
いまdouble型の引数を2つ取るdivideというメソッドがあるとする。
public static void divide(double n1,
double n2) {
…
}
このメソッドは、与えられた引数の除算を行い、その結果を表示する。
n1 ÷ n2 ・・・・・この結果を表示する
ところで除算を行う時は、0で割る事はできない。したがって、もしn2の値が0ならば、
エラーメッセージを出力して除算をキャンセルするようにしたい。
そこで、このメソッドの先頭部分に次のようなif文を入れる。
if (n2 == 0) {
System.out.println("0で割る事はできません");
//ここでこのメソッドを抜ける
}
まとめると、メソッドdivideは次のようになる。
public static void divide(double n1,
double n2) {
if (n2 == 0) {
System.out.println("0で割る事はできません");
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・(1)
}
System.out.println(n1 + "÷"
+ n2 "=" + n1 / n2);
}
問題は、この(1)の部分である。n2が0の場合は、ここでメソッドdivideの処理を中止し、途中でメソッドを抜け出したい。
しかし、通常はメソッドの最後まで処理を実行してしまう。
もちろんelse節を作れば、このことは可能である。
しかし、この例にかかわらず「メソッドを途中で抜け出したい」事はある。そのような時は、次に説明するreturn文を使う。
return文
return文を使うと、メソッドの途中からただちに抜ける事が出来る。
例えば次のようなメソッドがあった場合、文1〜文3を実行したところでメソッドを抜け出してしまう。この場合、文4〜文5は実行されない。
public static void divide(double n1,
double n2) {
文1;
文2;
文3;
return; ・・・・・ここでメソッドを抜ける
文4;
文5;
}
return文は、mainメソッドには使えない。mainメソッドを抜けるとアプリケーションが終了するという特殊性があるからで、
mainメソッドを抜けるには、既に説明したexit文を使用する。
次にreturn文を使ったサンプルアプリケーションを示す。この中に出てくるメソッドdivideは、先程と同様の除算を行うものである。
サンプル:Divide.java
//
//Divide.java---return文の使い方
//
public class Divide {
public static void divide(double
n1, double n29 {
if (n2 == 0) {
System.out.println("0で割る事はできません");
return;
}
System.out.println(n1 + "÷"
+ n2 + "=" + n1/n2);
}
public static void main(String[ ]
args) {
if (args.length < 2) {
System.out.println("使い方:コマンド名数字数字");
System.exit(1);
}
divide(Double.perseDouble(args[0],
Double.perseDouble(args[1]));
}
}
実行例
$ java Divide ・・・・・・・・・・・・・引数を与えない場合
使い方:コマンド名数字数字
$ java Divide 4380.23 0 ・・・・除数に0を指定した場合
0で割る事はできません
$ java Divide 4380.23 52.09
4380.23÷51.09=85.73556468976315
$ _
メソッドの値
引数を使うと、メソッドの呼び出し用側からメソッドにデータを送信する事が出来る。
逆にメソッドからメソッドの呼び出し用側のデータを送信する事も出来る。このデータをメソッドの値、あるいはメソッドが返す値という。
メソッドには、値を返すものと返さないものがある。
メソッドがその呼び出し側に値を返す時、その値を前項で取り上げたreturn文で指定する。
すなわち、return文の後ろに値を指定すると、その値が「メソッドの値」になる。
return 値; ←この値がメソッドの呼び出し側に返される
例えば、fooという名前の値を返すメソッドがあったとする。そのfooの中で次のようにしてreturn文を使ったとする。
return 12345;
すると、ここで指定した12345が呼び出し側に返される。例えば、次のようにしてfooを呼び出すと、変数xに12345が代入される。
x = foo(・・・・); メソッドfooの呼び出し
return文で指定出来る値は1つだけである。引数のように複数の値を指定する事はできない。
return 値, 値, …; ・・・・・これはダメ
したがって、メソッドからメソッドの呼び出し用側に返せる値は1つだけである。
メソッドの型
javaで使用されるデータにはcharとかintといったような型がある。
当然メソッドの値にも型がある。その型を指定するのが、メソッドの定義におけるvoidの部分である。
public static void メソッド名(引数) { ・・・下線部でメソッドの値の型を指定する
例えば、int型の値を返すメソッドならば、次のようにvoidの代わりにintを指定する。
public static int メソッド名(引数) {
また、double型の値を返すメソッドならば、次のようにdoubleを指定する。
public static double メソッド名(引数) {
void
では、これまで型名の代わりに使用してきたvoidは何かと言うと、そのメソッドが値を持たない(値を返さない)事を示す。
まとめると、メソッドの定義はそのメソッドが値を返すか返さないかにより、次の2通りの書き方がある。
値を返さないメソッドの定義
public static 型 メソッド名(引数) { ・・・下線部にvoidを指定する
文1
文2
…
return; ・・・return文を使う場合は値を指定しない
}
値を返すメソッドの定義
public static 型 (引数) { ・・・下線部にintなどの型名を指定する
文1
文2
…
return 値; ・・・必ずreturn文を使って返す値を指定する
}
大きいほうの値を返す
値を持つメソッドの例として、引数で指定された2数のうち大きいほうの値を返すメソッドbiggerを作成する。
public static int bigger(int n1, int
n2) {
return「n1, n2のうち大きいほうの値」;
}
もしn1とn2が等しい場合は、その値を返す。そのようなメソッドbiggerの作成例とテストできるサンプルを示す。
サンプル:Bigger.java
//
//Bigger.java---値を返すメソッド
//
public class Bigger
//大きい方の値を返す
//等しい場合は、その値を返す
public static int bigger(int n1,
int n2) {
if (n1>= n2)
return n1;
else
return n2;
}
public static void main(String[ ]
args) {
if (args.length <2) {
System.out.println("使い方:コマンド名数字数字");
System.exit81);
}
int n1 = Integer.parseInt(args[0]);
int n2 = Integer.parseInt(args[1]);
System.out.println(n1 + "と"
+n2 + "では" + bigger(n1,n2) +
”の方が大きいです");
}
}
実行例
$ java Bigger 1 7 ・・・・・・・・・右の値のほうが大きい場合
1と7では7の方が大きいです
$ java Bigger 28 9 ・・・・・・・・左の値のほうが大きい場合
28と9では28の方が大きいです
$ java Bigger 100 100 ・・・・・同じ値の場合
100と100では100の方が大きいです
$ _
次へ