これまでは最初に実行されるmainメソッドのみを記述してきました。
ここではmainメソッド以外のメソッドについて解説します。
メソッドとは
メソッドとはクラスが持つ機能のことです。(性質のことはフィールドと呼びます)
メソッドは他のメソッドから呼ばれ、メソッド内の処理を実行します。
メソッドは複数の処理を1つの機能と定義することができます。
形式は以下の通りです。
戻り値の型 メソッド名(引数の型 引数名, ...)
{
メソッドの処理;
:
return 式;
}
メソッドの呼び出し
フィールドへのアクセスと同様にドット(.)で呼び出すことができますが、メソッドは他のクラスメソッドから呼び出す場合と、自身のクラスメソッドから呼び出す場合で、少し書き方に違いがあります。
他のクラスメソッドから呼び出す場合
他のクラスメソッドからメソッドを呼び出す場合の形式は以下の通りです。
// 戻り値を受け取らない場合
クラスオブジェクト.メソッド名(引数);
// 戻り値を受け取る場合
変数 = クラスオブジェクト.メソッド名(引数);
自身のクラスメソッドから呼び出す場合
自身のクラスメソッドからメソッドを呼び出す場合の形式は以下の通りです。
// 戻り値を受け取らない場合
メソッド名(引数);
// または
this.メソッド名(引数);
// 戻り値を受け取る場合
変数 = メソッド名(引数);
// または
変数 = this.メソッド名(引数);
それでは、サンプルコードを書いて動きを見ていきましょう。
public class CL1{
public static void main(String args[])
{
CL2 cl2 = new CL2();
cl2.Func1();
}
}
class CL2{
void Func1()
{
System.out.println("Func1を実行しました。");
Func2();
}
void Func2()
{
System.out.println("Func2を実行しました。");
}
}
Func1を実行しました。
Func2を実行しました。
引数
引数はメソッドにデータを渡すことができます。
何も渡さない場合は何も記述しません。voidと書くとコンパイルエラーになります。
呼び出し元でメソッドに渡す引数(データ)は実引数(Argument)と呼び、メソッドで定義した引数(変数)は仮引数(Parameter)と呼びます。
この2つは別物ですので、仮引数の値を変更しても実引数に指定した変数の値は変わりません。
※変数名を同じにしても別物です。
記述例:
public class CL3{
public static void main(String args[])
{
CL4 cl4 = new CL4();
int data1 = 10;
cl4.Set(data1);
System.out.println("cl4.data2に"+cl4.data2+"がセットされました。");
System.out.println("data1の値は"+data1+"です。");
}
}
class CL4{
int data2;
void Set(int arg)
{
data2 = arg;
arg = 20;
}
}
cl4.data2に10がセットされました。
data1の値は10です。
このように、実引数で指定した変数[data1]の値は変更されません。
なぜ変更されないかというと、実際にメソッドに渡しているのは変数ではなく変数のデータだからです。これを値渡しと呼びます。
では実引数の値をメソッドで変更する方法が無いかというと、そうではありません。
型には基本型と参照型という2種類があります。
基本型については次のページで解説しています。
参照型は、配列とクラスの2種類があります。
この参照型の変数は、変数自体が値を持っているのではなく、値が格納されている場所を示す参照情報を持っているため、この参照情報を値渡しすることで実引数と同じデータを仮引数も指すことになり、実引数の値を変更することができます。
これは参照渡しではなく、参照の値渡しです。(※Javaには参照渡しはありません)
実際に書いてみましょう。
public class CL5{
public static void main(String args[])
{
CL6 cl6 = new CL6();
int ary[] = {1,2,3};
cl6.Set(ary);
for(int i=0; i<ary.length; i++){
System.out.println("ary["+i+"]の値は"+ary[i]+"です。");
}
}
}
class CL6{
void Set(int arg[])
{
for(int i=0; i<arg.length; i++){
arg[i] += 10;
}
}
}
ary[0]の値は11です。
ary[1]の値は12です。
ary[2]の値は13です。
戻り値
引数とは逆に、メソッドが呼び出し元にデータを返すことができます。
この返すデータのことを戻り値と呼びます。
ただし、戻り値は引数とは異なり、データを1つしか返すことができません。
また型を省略することはできません。何も返さない場合は、voidと記述します。
return文
戻り値はreturn文で返すことができます。
return文は複数記述でき、戻り値なし(void)でも記述できます。
またreturn文を実行すると、後続に処理があっても実行されません。
return文を実行した時点でメソッドの処理が終了します。
記述例:
public class CL7{
public static void main(String args[])
{
CL8 cl8 = new CL8();
int data;
// メソッドの実行結果を受け取ります
data = cl8.Max(10, 20);
System.out.println("dataの値は"+data+"です。");
// 戻り値は不要なら無視してもOKです
cl8.Max(10, 20);
// return文を実行すると、その時点で処理が終了するため
// 後続の処理は実行されません
cl8.Func1(0);
}
}
class CL8{
int Max(int arg1, int arg2)
{
if(arg1 > arg2) {
return arg1;
}else{
return arg2;
}
}
void Func1(int arg1)
{
if(arg1 == 0){
System.out.println("1つ目のreturn文で返ります。");
return;
}
System.out.println("2つ目のreturn文で返ります。");
return;
}
}
dataの値は20です。
1つ目のreturn文で返ります。
コメント