今回は「メソッド」と「変数」について説明していきます。
◆メソッド
前回、「オブジェクトは属性と操作を一つにまとめたもの」という説明をしました。
その「操作」にあたるものがメソッドです。
構文は
修飾子 戻り値の型 メソッド名 (引数の型 引数1,…) {
処理内容;
return 戻り値;
}
となっております。
構文に「引数」と「戻り値」という値があります。
- 引数
引数はメソッドの呼び出し元から渡された値をメソッド内で実行するための値です。
メソッド名の後ろの()の中で型と一緒に指定するのですが、複数指定することも可能ですし、引数なしでも構いません。
引数を複数指定する場合はカンマで区切って増やします。 - 戻り値
戻り値はメソッドの実行後、呼び出し元に返す値のことを言います。
戻り値はメソッドブロック内でretrun文で書きます。
戻り値の型は、戻り値の前ではなく、メソッド名の前で指定します。
戻り値は指定しなくても構いません。その場合は型は「void」となります。
わからない!という方は引数は「入力する値」、戻り値は「出力する値」と考えるとわかりやすいかもしれません。
メソッドにはインスタンスメソッドと、staticメソッドがあります。
インスタンスメソッドは、クラスをインスタンス化し、作成したオブジェクトの参照変数名を用い、
参照変数名.メソッド名
で呼び出します。
一方staticメソッドはクラスをインスタンス化しても、しなくても使うことができます。
インスタンス化せずに呼び出すには、
クラス名.変数名
で呼び出します。
◆変数
以前、「とっても簡単なJAVA」の第6回、第7回で変数の説明がありました。
今回はさらに詳しく説明していきます。
まず変数には3種類あります。
- インスタンス変数
- static変数
- ローカル変数
サンプルプログラムでどれがどれなのか確認してみましょう。
public class Sample8_1 { int x = 20; // xはインスタンス変数です。 static int y = 35; // yはstatic変数です。 void method(int z) { // methodメソッドの引数zはローカル変数です。 int i = 99; // iはローカル変数です。 } }
●インスタンス変数
インスタンス変数はクラスブロックに定義された変数を指します。
インスタンス変数はクラスがインスタンス化されると使用することができる変数です。
複数オブジェクトが生成された場合はオブジェクトそれぞれが変数を持ちます。
また、インスタンス変数のことをフィールドとも呼びます。
初期化せずに使用可能です。
●static変数
インスタンス変数と同様にstatic変数もクラスブロックに定義されますが、インスタンス化しないでも使用することがで きます。
インスタンス化された場合でもstatic変数は1つだけしか存在しません。
そのため各オブジェクトは1つの変数を共有する形となります。
初期化せず使用可能です。
●ローカル変数
ローカル変数はメソッドの引数や、メソッド内で定義される変数のことをいいます。
ローカル変数は変数宣言したメソッド内のみでしか使用することができません。
初期化しないとコンパイルエラーになります。
今まで扱ってきた変数はほとんどローカル変数でしたが、今回はインスタンス変数とstatic変数を使用したサンプルプログラムをみてみましょう。
class Dog { static int count; // static変数 String name; // インスタンス変数 String kensyu; // インスタンス変数 public Dog(String n, String k) { // コンストラクタ name = n; // ローカル変数 kensyu = k; count++; } String getName() { // getNameメソッド return name; // 戻り値name } String getKensyu() { // getKensyuメソッド return kensyu; // 戻り値kensyu } } public class Sample8_2 { public static void main(String[] args) { // mainメソッド // Dogクラスをインスタンス化し、dogオブジェクトを作成。第一引数に名前、第二引数に犬種を指定 Dog dog1 = new Dog("メロン", "柴犬"); Dog dog2 = new Dog("ポチ", "ミニチュアダックス"); Dog dog3 = new Dog("まさお", "ラブラドール"); // 参照変数名.メソッド名で呼び出し System.out.println("名前は" + dog1.getName() + "で、犬種は" + dog1.getKensyu() + "です。"); System.out.println("名前は" + dog2.getName() + "で、犬種は" + dog2.getKensyu() + "です。"); System.out.println("名前は" + dog3.getName() + "で、犬種は" + dog3.getKensyu() + "です。"); // クラス名.static変数名で呼び出し System.out.println("数:" + Dog.count + "匹です。"); } }
実行結果
名前はメロンで、犬種は柴犬です。
名前はポチで、犬種はミニチュアダックスです。
名前はまさおで、犬種はラブラドールです。
数:3匹です。
このように表示されます。
Dogクラスにはstatic変数が1つ、インスタンス変数が2つ宣言されています。
そしてコンストラクタ、getNameメソッド、getKensyuメソッドの3つのメソッドが定義されています。(コンストラクタについては次回説明します)
それらのメソッドで「name」や「kensyu」といった変数が共通して使われています。
クラスの直下に変数宣言すると、そのクラス内で共通して使える変数になるのです。
つまり、複数のメソッドで共通して使用したい変数があるときに、インスタンス変数やstatic変数を使うのです。
Sample8_2クラスではDogクラスがインスタンス化されています。
その際、引数に(“メロン”, “柴犬”)、(“ポチ”, “ミニチュアダックス”)、(“まさお”, “ラブラドール”)というString型の値が渡されています。
するとコンストラクタの引数にそれぞれの文字がnとkに渡され、それぞれが変数nameと変数kensyuに代入され、countがインクリメントされます。
そしてgetName()とgetKensyu()でnameとkensyuに代入された値をそれぞれ取り出します。
すると実行結果のようになるのです。
今度はインスタンス変数とstatic変数の違いに注目してみましょう。
インスタンス変数であるnameとkensyuの値がオブジェクトが各々持っているのに対し、countの値は3つのオブジェクトで共有しています。
そのためオブジェクトが生成されるたびにcountが増えていき、実行結果では3(匹)という値が返ってきます。
もしこれがインスタンス変数だったら、countが3つ複製され、それぞれが「1」になってしまうということになります。
これがインスタンス変数とstatic変数の違いになります。
今回はここまでとしたいと思います。