![]() ![]() ![]() ![]() | オブジェクト、クラス、インタフェース |
メソッド宣言はメソッドに対し、コンパイラ、ランタイムシステムおよび他のクラスとオブジェクトについて多くの情報を提供する。 メソッドの名前に加えて、メソッド宣言はメソッドの返り値、メソッドが必要とする引数の数と型、メソッドを呼び出せる他のクラスとオブジェクトなどの情報を伝える。これはクラスのメソッドを宣言するよりむしろ小説を書いているように見えるかも知れないが、ほとんどのメソッド属性が暗黙に宣言することができる。 メソッド宣言に必要な2つの要素は、メソッド名とメソッドによって返されるデータ型である。 例えば次の例では、stack クラス内で論理値(
true
あるいはfalse
)を返すisEmpty()
と指定されたメソッドを宣言する。class Stack { . . . boolean isEmpty() { . . . } }メソッドからの値の返却
Java では、メソッドが返す値のデータ型を宣言することを要求する。 メソッドが値を返さないようにするには、void を
返すように宣言することができる。メソッドは、プリミティブデータ型あるいは参照データ型のいずれかの値を返すことができる。 Stack クラスでの
isEmpty()
メソッドは、プリミティブデータ型の論理値を返す。一方、 Stack クラスでのclass Stack { static final int STACK_EMPTY = -1; Object stackelements[]; int topelement = STACK_EMPTY; . . . boolean isEmpty() { if (topelement == STACK_EMPTY) return true; else return false; } }pop()
メソッドは参照データ型のオブジェクトを返す。メソッドは値を返すためにclass Stack { static final int STACK_EMPTY = -1; Object stackelements[]; int topelement = STACK_EMPTY; . . . Object pop() { if (topelement == STACK_EMPTY) return null; else { return stackelements[topelement--]; } } }return
演算子 を使用する。void
と宣言されていないメソッドはreturn
文を含まなくてはならない。
return
文が返す値のデータ型は、メソッドが返すために取り込むデータ型と一致しなくてはならない。整数を返すと宣言されたメソッドから Object を返すことはできない。 オブジェクトを返す時には、返されるオブジェクトのデータ型は、サブクラスあるいは示された正確なクラスのどちらかでなくてはならない。 インタフェース型を返す時には、返されるオブジェクトは指定されたインタフェースを実装しなくてはならない。メソッドの名前
メソッド名は正当な Java の識別子であればどれでもよい。 Java メソッド名に関して考慮すべき3つの特別なケースがある。
- Java がメソッド名のオーバーロードをサポートするので、多数のメソッドが同一名を共有することができる。 例えば、描画領域に種々のタイプのデータ(文字列、整数など)を描画することができるクラスを書いていたと仮定する。 あなたはそれぞれのデータ型を描画する方法を認識しているメソッドを書く必要がある。ほかの言語では、
drawString()
、drawInteger()
、drawFloat ()
など、各メソッドの新規名を考えなければならない。 Java において、すべての描画メソッドに同一名を使用することができるが、それぞれのメソッドに異なったタイプのパラメータで渡すことができる。 これにより、データ描画クラスでは、draw()
という名前のメソッドを3つ宣言することができ、それぞれが異なった型のパラメータを取る。注釈: メソッド宣言の括弧内の情報は、メソッドに対する引数である。 引数については次のページの メソッドへの情報の引き渡しで説明する。
class DataRenderer {
void draw(String s) {
. . .
}
void draw(int i) {
. . .
}
void draw(float f) {
. . .
}
}
メソッドはメソッドに渡す引数の数と型によって、コンパイラで区別される。 したがって、
draw( String s )
とdraw( int 、i、)
は別個の一意のメソッドである。 同じシグニチャで複数のメソッドを宣言することはできない。draw( String s )
とdraw( String t )
は同一なので、コンパイラエラーをもたらす。 オーバーロードしたメソッドが同じデータ型を返さなくてはならないのに注意しよう。つまり、 同じクラスで宣言されたdraw( String s )
とint draw( String t )
はコンパイル時エラーをもたらす。クラスと同じ名前を持つメソッドはコンストラクタであり、特別な実行義務がある。 コンストラクタはクラスの型の新規のオブジェクトを初期化するために使用される。 コンストラクタは Java の new
演算子 で呼び出すことができる。 前述のオブジェクトの作成でオブジェクトを作成する方法を学習した。 コンストラクタを書く方法を学習するためには、コントラクタメソッドの書き方を参照のこと。クラスはそのスーパークラスでオーバーライドすることがある。 オーバーライドするメソッドは、オーバーライドするメソッドと同じ名前、返却値の型およびパラメータリストを持っていなくてはならない。メソッドのオーバーライド では、クラスのスーパークラスでメソッドをオーバーライドする方法を説明する。 メソッド宣言の高度な機能
メソッド宣言の2つの必須要素に加えて、メソッド宣言が同様に他の要素を含むことがある。 これらの要素は、メソッドがクラスメソッドかどうかなど、メソッドが受け入れる引数を宣言する。結局、メソッド宣言は次のようになる。
メソッド宣言のそれぞれの要素については、この入門書の要所で説明する。 次のリストでの最初の 4 つのリンクはこのレッスンで説明する。 ページの上下にある左右の矢印マークのリンクを使用すれば、これらの4つの節を見ることができる。[accessSpecifier] [static] [abstract] [final] [native] [synchronized] returnType methodName ([paramlist]) [throws exceptionsList]リストの最後の3つのリンクは、レッスンに必要なトピックス、あるいは別のレッスンですでにクリティカルであったトピックスを説明する。 これらのリンクを選択すると、この入門書のさまざまなページに移ることができる。 必ず戻って来ること!
- 引数を通してメソッドに情報を渡す。 メソッドへの情報の引き渡しを参照のこと。
- 変数宣言のように、プログラムで他のオブジェクトとクラスがメソッドを呼び出すことができるかどうか制御するために、メソッド宣言はアクセス指示子を使用することができる。クラスのメンバへのアクセスの制御を参照のこと。
- メソッドがインスタンスメソッドあるいはクラスメソッドであるかどうかも指定することができる。インスタンスとクラスメンバのためにここをクリックしなさい。
- メソッドがオーバーライドされるかどうか、あるいはクラスもメソッドのために実装を提供するかどうかなど、クラスを作成するときは、メソッドがクラスのサブクラスにそのメソッドの情報を提供しなければならないことがある。 クラスのサブクラス化によるメソッド宣言への影響については、サブクラス、スーパークラス、継承 を参照のこと。
- メソッドが例外をあげるなら、メソッド宣言はあげることができる例外を示さなくてはならない。 例外を使用したエラー処理を参照のこと。 特に、メソッドがでの例外の処理宣言のページを参照しなさい
- 関数の重要なライブラリが C 言語のような別の言語で書かれた場合、それを保持して、Java からそれらの関数を使用したいことがある。 Java 以外の言語に実装されたメソッドはネイティブメソッドと呼ばれ、メソッド宣言内で宣言されなければならない。 Java コードをほかの言語で書かれたコードと統合する方法を学習するには、ネイティブメソッドのJava プログラムへの統合を参照のこと
- 同時に実行中のスレッドがしばしば同じデータで動作するメソッドを起動する。 これらのメソッドは、データがプログラムが実行される間、一貫した状態で残っていることを保証するために同期をとっていなければならない。
synchronized
キーワードでメソッドが必ず同期を取ることを宣言する。 メソッド呼び出しの同期については制御のスレッドで説明する。 同期のページに特に注目すること。
![]() ![]() ![]() ![]() | オブジェクト、クラス、インタフェース |