Revised: Feb./23rd/2003: Since: Dec./28th/2001
メソッドについてまとめておきます。
メソッドは、メンバー変数(フィールド、属性)と並んでクラスのメンバーとして数えられる要素の代表格です。
メソッドには、そのクラスをインスタンス化して作ったオブジェクトの機能を記述します。オブジェクトを使う方法ともいえます。具体的には、入力、処理、出力 (Input/Process/Output) を記述します。多くの場合は、当該オブジェクトのデータであるメンバー変数に対する処理になります。
一方、そのクラスを利用する側のプログラマーは、最低でもメソッドの目的と入力と出力を知っている必要があります。メソッドの入力と出力は、メソッド引数と戻り値と呼ばれます。
以上を踏まえると、クラスのメンバであるメソッドは、次のような書式になります:
戻り値型 メソッド名(メソッド引数リスト) { 処理 return 戻り値; }
簡単な例を挙げます。int
型のメソッド引数を持ち、 String
型の戻り値を持つメソッド msg()
のメソッドは、次のように書きます:
String msg(int i) { String str = ""; // 処理 return str; }
戻り値も引数も、何れか一方しか存在しない場合もあります。例えば、戻り値がない場合は、戻り値型には void
を指定します。
void setName(String aName) { name = aName; }
同じクラス内の別のメソッドを呼び出したり、別のクラスから生成されたオブジェクトのメソッドを利用することができます。
ActivityDemo.java
:
class Activity { private double hours; public void setHours(double aHours) { hours = aHours; } public double getHours() { return hours; } public double calcAvailability(int total) { return getHours()/total; } } class ActivityDemo { public static void main(String[] args) { Activity obj = new Activity(); obj.setHours(140); System.out.println(obj.calcAvailability(150)); } }
C:\java>javac ActivityDemo.java C:\java>java ActivityDemo 0.9333333333333333 C:\java>
これがメソッドの基本です。メソッドの本質は、入力(メソッド引数)、出力(戻り値)、処理の三つです。
より正確なメソッド定義を紹介します。メソッド定義もメンバ変数定義に似ています。
[修飾子] [戻り値型] メソッド名(<引数リスト>) { ステートメント }
戻り値の型が、このメソッドの型であると考えると、メンバ変数と似通った構成になっていることが分かります。
abstract |
抽象メソッド。抽象メソッドを一つでも持つクラスは抽象クラス。メソッド名、引数、戻り値は定義されているが、ブロック内の処理(実装)が行われていない。 |
---|---|
final |
オーバーライドできないメソッド。継承によってこのメソッドの機能変更/拡張はできない。 |
private |
同じクラスからしか呼び出せない(メッセージが届かない)メソッド。 |
省略 | 同じパッケージ内からしか呼び出せない。 |
protected |
同じパッケージかそのサブクラスからしか呼び出せない。 |
public |
何処からでも呼び出せる。 |
static |
静的メソッド。当該メソッドが定義されているクラスをインスタンス化しなくても利用できる。インスタンスによらず同じ働きをするメソッドに用いる。 |
synchronized |
マルチスレッド時に同期を取るメソッド。スレッドに呼び出された時点でロックされる為、複数のプロセスによって実行されることがなくなる。 |
native |
C 言語などで作成された函数などのネイティブコード。 |
アクセス制限を記述する修飾子は public
, protected
, private
の3つ。これらは相互に排他的で、一つのメソッドに複数記述することは出来ません。これら3つのアクセス制限修飾子を記述しない場合は、同じパッケージからしか呼び出せないものと解釈されます。 アクセス制限を明示する修飾子は、無指定を加えると、4つ存在することになります。アクセス制限の強いものから順に、private > 無指定(省略) > protected > public になります。
他のオブジェクトから利用可能なメソッドの事を、インタフェース・メソッドと呼びます。他のオブジェクトとの会話のインタフェースになるメソッドは少ないほうが安全です。最初は全てのメソッドを private にしておき、必要に応じて、インタフェースメソッドを選び出して public にしましょう。
次の例では、メンバ変数の定義とメソッドの定義が似通っていることがお分かりいただけるでしょう:
class MethodTest { //メンバ変数 private String tty = "lft0"; //メソッド public String getTTY() { return tty; } }
メソッド getTTY()
は String
型で定義されています。 String
型変数の tty
と比べていただければ、考え方が同じであることがご理解いただけるでしょう。
配列型の戻り値も可能です。
Test.java
:
class ArrayMethod {
public String[] msgs() {
String[] strs = {"Hello", "Howdy", "Bye"};
return strs;
}
}
class Test {
public static void main(String[] args) {
ArrayMethod obj = new ArrayMethod();
String[] coms = obj.msgs();
for (int i=0; i<coms.length; i++) {
System.out.println(coms[i]);
}
}
}
戻り値が無い場合は、型宣言の部分に void
と記述します:
class VoidTest {
String id;
void setId(String str) {
id = str;
}
}
main()
main()
メソッドは一般に、次のように定義します:
public static void main(String[] args)
public
修飾子はクラス外からのアクセスを可能にします。main() メソッドに public 修飾子を指定するのは単なる習慣です。
static
修飾子が指定されているのは、このメソッドをメンバに持つクラスが、インスタンス化されなくても利用できるようにしたものです。main() メソッドは、プログラムの開始直後に実行されるため、当該クラスがインスタンス化されなくても、利用できるようになっている必要があります。
戻り値は一般にありません。最初に実行されるメソッドなので、戻り値を返す相手がいないからです。
引数はコマンドラインからのものを受け取ります。これを、String
型の配列で定義しておきます。