メソッドとは複数の文をまとめ、それを1つの処理として名前をつけたもので、部品の最小単位です。
メソッド利用によるメリット:
プログラムの見通しがよくなり、全体を把握しやすくなる。機能単位に記述するため、修正範囲を限定できます。同じ処理を1つのメソッドにまとめることで、作業効率が上がります。
● メソッドの頭部
* 修飾子
修飾子 | 意味 |
---|
public | アクセス制限(どこからでもアクセス可能) |
protected | アクセス制限(同一パッケージ内のクラス、継承したクラスからのみ可能) |
default | アクセス制限(同一パッケージ内のクラスからのみ可能) |
private | アクセス制限(そのクラスからのみ可能) |
abstract | 抽象メソッド |
final | オーバーライド不可 |
static | クラスメソッド |
synchronized | 同時のたものロック獲得 |
native | ネイティブメソッド |
strictftp | 浮動小数点演算を厳密に評価 |
以上の修飾子はそれぞれ深い意味を持ち、特殊の場面にしか使いません。詳しくは次のアクセス制御、抽象クラスと抽象メソッド、finalクラス、スレッドなどで参照してみてください。publicとprotectedとprivateは同時に指定できません。abstract修飾はstatic、final、synchronized、native、strictfpと同時に指定できません。それ以外は同時に指定できます。* 戻り値型(return stype)
戻り値型は自分を呼び出した部品=メソッドに戻す値(return value)の型です。;何も戻さないときは「void」と記述します* メソッド名(method name)
メソッドの名前です。メソッドはこの名前の元に、他の部品から呼び出されます。
メソッド名の付け方について詳しく見たい方:
* 仮引数並び(formal parameter list)
メソッドに対する”補助的な指示”を受け取るための変数である仮引数を()の中で宣言します。本メソッドのように複数の仮引数を受け取る場合はコンマで区切ります。 ● メソッドの本体(method body)
メソッドの本体は、ブロック、つまり{}で囲まれた0個以上の文の集合です。メソッド本体の中で宣言された変数はメソッドの中のみ利用できます。メソッド本体の中で、メソッド名と同一名の変数を宣言しても良いことになっています。メソッドと変数は種類が異なるため、名前が衝突しないからです。メソッド本体内では、仮引数と同一名の変数を宣言できません。 ● 例題
例題1 : 「こんにちは」とコンソールに出力するメソッド例
public static void HELLO(){
System.out.println("こんにちは");
}
public:修飾子で、どこからでもアクセス可能static:修飾子で、クラスメソッドであることvoid:戻り値型の場所ですが、何も戻さないため 「void」となります。HELLO:メソッド名():引数を入れる括弧{}:この括弧の中はメソッドの本体であること。このメソッドの本体は「System.out.println("こんにちは")」だけです。このメソッドの意味:このメソッドが呼ばれたら、「こんにちは」とコンソールに出力して終わりというシンプルなメソッドです。例題2 : 整数a,bの和を計算するメソッドです。数学の f(x) = a + bを計算するのと同じです。例
public static int SUM(int a, int b) {
int s = a+b;
return s;
}
public:修飾子で、どこからでもアクセス可能static:修飾子で、クラスメソッドであることint:戻り値型はintであるSUM:メソッド名(int a, int b):メソッドの仮引数int型のa,b変数である{}:この括弧の中はメソッドの本体であること。このメソッドの意味:与えられた整数a,bに対して和の値を返すのです。例えば、引数a,bに2,3という値を与えて、メソッド実行すると、s=a+bの価値を戻すという役割です。数学でいうと、f(2,3) = 2 + 3 = 5 との結果を戻すのです。
● クラス内からのメソッド呼び出し
メソッドを使用することをメソッドの呼び出しと言います。メソッド名を書いて呼び出せる範囲はクラス内です。メソッドはクラス内で書く順序はありません、フィールドと異なり、、メソッド宣言より前の行でもそのメソッドを呼び出せます。メソッドはクラス内で「フィールド変数の初期化子」、「別のメソッド」、「コントラクタ」、「初期化ブロック」に利用されています。以下をご覧ください。例
class Home{
//フィールド変数の初期化子
int i = doit();
//別のメソッド
void caller(){
doit();
}
//コンストラクタ
Home(){
doit();
}
//初期化ブロック
{
doit();
}
//メソッド宣言
int doit(){
System.out.println("do it");
return 1;
}
}
例題 : int型の二つのパラメータを受け取り、足し算をした結果を返すメソッドを作成します。mainメソッドでそのメソッドを呼び出し、結果をコンソールに出力する。例
package helloworld;
public class HelloWorld {
public static void main(String[] args) {
int x = Sum(3,4);
System.out.println(x);
}
static int Sum(int a,int b) {
int s = a+b;
return s;
}
}
● 他のクラスからのメソッド呼び出し
アクセス制御が許せば、他のクラス内のコードからメソッドを呼び出せます。オブジェクト参照にメソッドアクセス演算子(ドット)を適用します。、クラス内で作成したメソッドを呼び出すときに、メソッド名だけで十分ですが、他のクラスからのメソッドを呼び出すために、そのメソッドが入っているクラスを示す必要があります。クラス名とメソッド名の間に「.」をつけます。例題 : HelloWorld2クラスでint型の二つのパラメータを受け取り、足し算を計算した結果を返すメソッドを定義する。そのメソッドをHelloWorldクラスのmainメソッドで使え。例
package helloworld;
public class HelloWorld {
public static void main(String[] args) {
int x = HelloWorld2.Sum(3,4);
System.out.println(x);
}
}
class HelloWorld2 {
static int Sum(int a,int b) {
int s = a+b;
return s;
}
}
● メソッド呼び出しと引数
メソッド呼び出しと引数の関係を説明します。HelloWorld2クラスを例に、2つの整数の足し算するメソッドを考えます。
例
package helloworld;
public class HelloWorld {
public static void main(String[] args) {
int x = Sum(3,4);
System.out.println(x);
}
static int Sum(int a,int b) {
int s = a+b;
return s;
}
}
言葉を2つ定義します。メソッド定義のパラメータ変数(上はa,b)を仮引数と呼びます。呼び出し側でメソッドに渡すパラメータ(上は3,4)を実引数と呼びます。
どんな場合であれ、メソッド呼び出し前に全ての実引数の評価を行います。呼ばれたメソッド側で仮引数に実引数の評価値を代入します。上記の例で説明しますと、仮引数a,bに3,4が代入されてから、メソッドの本体を実行します。引数の型が基本型の場合、実引数の値が仮引数にコピーされます。仮引数の値を変えようが、別の値を再代入仕様が実引数には影響ありません。引数の型は参照型であっても、実引数の値が仮変数にコピーされる原理は同じです。ただし、コピーする値は参照型なので、仮引数と実引数は同じオブジェクトを参照することになります。
メソッド内で宣言した変数(上はs変数)をローカル変数と呼びます。ローカル変数とパラメータ変数はメソッドが呼ばれた時のみ変数として存在します。いつどこからメソッドが呼ばれようと、ローカル変数とパラメータ変数は常にリフレッシュされて新たに存在します。メソッドを抜けると(メソッドを最後まで実行、return文により途中で抜ける、もしくは例外で抜けた場合)、変数は消滅します。他の変数同様、変数が存在することと、参照先のオブジェクトの存在は無関係であることに留意してください。パラメータ変数とローカル変数がメソッド呼び出しごとに常に新規に存在し、メソッドをぬけると同時に消滅する動作を特に意識するのは、マルチスレッド動作と再帰呼び出しの時です。メソッドの再帰呼び出し:
再帰呼び出しではメソッド内から同じメソッドを呼び出します。この場合もパラメータとローカル変数はそれぞれのメソッド呼び出しごとに独立して存在します。以下の例-f(x)= n! = 1.2.3.....nを計算するメソッドを考えましょう。例
package helloworld;
public class HelloWorld {
public static void main(String[] args) {
int x = factorial(5);
System.out.println(x);
}
//メソッドfactorialを定義する
static int factorial(int n){
if(n==0){
return 1;
}
return n*factorial(n-1);
}
}
上のプログラムを見ると分かるように、factorial(n) の値を求めるメソッド定義で、factorial(n - 1) と自分自身を使っています。 つまり、自己参照しています。 factorial(n - 1) の値を知るためには factorial(n - 2) が必要で、それを知るには factorial(n - 3) が、、ということになります。 しかし、factorial(0) の値が与えられているために、この過程を逆にさかのぼって必要な値が求まるという仕組みになっています。 再帰的プログラミングでは、このようにさかのぼって行ったときに、最後に具体的値が定義されているように書かなければなりません。 そのような遡りが有限回数で終了して値が定義されていないと、無限に遡り続けようとして終了しないことになります。
● 戻り値とは
呼び出されたメソッドから、呼び出し元のメソッドへ値を返すことを「値を戻す」と言います。また、戻されるデータ(値)のことを戻り値と言います。
一般、以下の構文を使用します。
まず、「return」の行に注目しましょう。returnの後ろに書かれた値を呼び出し元に戻すことができます。変数に入っている値を戻すには「return 変数名;」のように変数名を指定します。また「return 10;」や「return "こんにちは";」のように戻したい値を直接描いても構いません。特に、何も戻さない場合でも、メソッドの実行を途中で打ち切りたい場合には「return;」を書きます。次に「戻り値の型」に注目してください。ここには基本的にreturnによって戻される値と同じ型を指定します。10のような整数を戻す場合は「int」、"こんにちは"のような文字列型を戻す場合は「String」、変数に入っている値を戻す場合は、その変数の型を書きます。何も戻さない場合は「void」を指定します。voidは「何もない」という意味です。 ● 戻り値をそのまま使う
メソッドの戻り値を変数で受けずに、そのまま使うこともできます。
例
package helloworld;
public class HelloWorld {
public static void main(String[] args) {
int x = Sum(Sum(1,2),4);
System.out.println(x);
}
static int Sum(int a,int b) {
int s = a+b;
return s;
}
}
上の例の6行にはsum()メソッドの呼び出しは2つあります。まず、Sum(1,2)が実行され、結果である3が戻り値として呼び出し元に返されます。それによりカッコの外側のsum(3,4)という状態になります。そして3と4の引数を持ってsumメソッドが再び呼び出され、7が戻されます。
皆さん、JAVAのメソッドの便利さと使い方は大体おわかりになりましたか!どの言語でもメソッドは重要で決して欠かせない部分だと思います。この記事に記したメソッドの宣言、呼び出し、引数の扱い方、戻り値などを把握して使いこなせるならいいと思います。
次の記事では配列を扱うメソッドで例題もいくつ述べて説明しているので、とても初心者に役に立つと思います。ぜひご覧ください。
以下はメソッドの基礎に関する演習問題です、ご参考を!
7. 演習問題
広告