シンプルなメソッド定義
必要最低限な定義は下記の通り。
ここではmain
メソッドでhello
メソッドを呼び出して使っている。
- 呼び出し元:
main
メソッド - 呼び出し先:
hello
メソッド
↑こういう言い方をする時もある。
public class Main{
// メインメソッド定義
public static void main(String[] args){
hello();
}
// helloメソッド定義
public static void hello(){
System.out.println("Hello World!");
}
}
メソッド呼び出しを入れ子構造にすることももちろんできる。
// メインメソッド定義
public static void main(String[] args){
methodA();
}
// methodA定義
public static void methodA(){
System.out.println("this is methodA");
methodB();
}
// methodB定義
public static void methodB(){
System.out.println("this is methodB");
}
※class定義分は省略。
引数の利用
メソッド定義文で引数を設定することができる。
呼び出し先の方で記述される引数は仮引数というらしい。
// メインメソッド定義
public static void main(String[] args){
printName("tanaka");
printName("suzuki");
printName("satou");
}
// printNameメソッド定義
public static void printName(String name){
System.out.println( name + "さん、こんにちは");
}
複数の引数を利用する場合、オーバーロードを利用することができる。
この場合、引数の個数・型・並び順が異なれば良い。
シグネチャが異なれば良いとも言う。
※シグネチャ:メソッド名+引数の個数・型・並び順
// メインメソッド定義
public static void main(String[] args){
System.out.println("引数は2:"+ov(10,20));
System.out.println("引数は3:"+ov(10,20,30));
System.out.println("引数は4:"+ov(10,20,30,40));
System.out.println("引数は文字でも良い:"+ov("takahashi"));
}
// ovメソッドの定義
public static int ov(int p, int q){ //仮引数2
int ans = p *q;
return ans;
}
public static int ov(int p, int q, int r){ //仮引数3
int ans = p * q - r;
return ans;
}
public static int ov(int p, int q, int r, int s){ //仮引数4
int ans = p * q - r * s;
return ans;
}
public static String ov(String name){ //
String ans = name;
return ans;
}
ちなみにmainメソッド自体も例外なくメソッドなので、ターミナルでコマンドライン引数を引数を打ってやれば、その情報をプログラムに追加することもできる。
例えばターミナルで
java Main 24歳 学生
と打ってやると、Main.javaファイルのmainメソッドで
public static void main (String[] args)
このString型の配列args
に24歳
,学生
という要素が追加される。
args[0]==24歳
, args[1]==学生
ということ 。
戻り値の利用
メソッド宣言文で戻り値を設定することで、mainメソッドに値を渡すことができる。
ここではint型の戻り値をreturn
でメインメソッドに返すようにしている。
// mainメソッド定義
public static void main(String[] args){
System.out.println("100と200の積は"+ret(100,200));
}
//retメソッド定義
public static int ret(int x, int y){
int ans = x * y;
return ans;
}
配列を用いる時の注意点
普通に引数として配列をメソッドに渡す場合はこんな感じ。
ここではprintArrayメソッド定義時に引数の型をint
->int[]
とするだけで良い。
// mainメソッド定義
// こっちで配列作成
public static void main(String[] args){
int[] array={10,20,30,40};
printArray(array);
}
// printArrayメソッドの定義
public static void printArray(int[] x){
for(int value: x){
System.out.println(value);
}
}
もちろん戻り値に配列を用いることもできる。
その場合は、makeArrayメソッド定義文の戻り値をvoid
-> int[]
にしてやる。
このプログラムはメインメソッドで指定した値を元に、makeArrayメソッドがその値に従って要素数を決め、配列を1,2,3,...と作る。それを戻り値としてメインメソッドに返している。
// mainメソッド定義
public static void main(String[] args){
int[] newArray= makeArray(5);
for(int value: newArray){
System.out.println(value);
}
}
// makeArrayメソッドの定義
// こっちで配列作成
public static int[] makeArray(int size){
int[] x = new int[size];
for(int i=1; i<x.length; i++){
x[i] = i;
}
return x;
}
値渡しと参照渡し
普通に引数・戻り値をメソッド間でやりとりする場合は、それは値そのものをやりとりしていると言っていい(値渡し, call by value)。
ただ、配列を引数・戻り値としてメソッド間でやりとりする場合は、値そのものではなく、メモリ上のアドレスを渡している(参照渡し, call by reference)。
したがって、mainメソッドで作成した配列
int[] array = {1,2,3,4} // mainメソッド
を引数として他のメソッドに渡した後、そのメソッド内で
array[0]=10; // 呼び出し先メソッド
とか代入してしまうと、メモリ上の値が変わることになる。そのため、mainメソッドで
System.out.println(array[0]);
とか打つと、返ってくる値は1
ではなく10
になる。
配列が10,2,3,4
と書き換えられるということ。
P.S
値そのものではなく、メモリ上のアドレスが代入される変数は参照型と呼ばれる。配列型以外のものではクラス型が参照型に含まれる。
サンプルコード
参照渡しで配列が書き換えられる例としてはこんなところか。
// mainメソッド定義
public static void main(String[] args){
int[] array={1,2,3,4};
incArray(aray);
for (int value: aray){
System.out.println(value);
}
}
// incArrayメソッド定義
public static void incArray(int[] x){
for(int i=0; i<x.length; i++){
x[i]++;
}
}
返ってくる配列は2,3,4,5
になっているはず。
参考書籍
スッキリわかるJava入門第2版
第5章 Pp.170-202, 336.