Previous | Next | Trail Map | Writing Java Programs | オブジェクト、クラス、インタフェース


メソッド本体

次のコード例では、 isEmpty() pop() メソッドのメソッド本体は太字で示される。

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;
    }
    Object pop() {
        if (topelement == STACK_EMPTY)
            return null;
        else {
            return stackelements[topelement--];
        }
    }
}

通常の Java 言語の要素に加えて、現在のオブジェクトでメンバを参照するためにメソッド本体で this を使用することができる。 現在のオブジェクトはそのメソッドが呼び出されているオブジェクトである。 現在のオブジェクトが隠した、あるいはオーバーライドしたスーパークラスのメンバを参照するために super も使用できる。 また、メソッド本体にはそのメソッドのローカル変数の宣言を含むことがある。

this

一般に、オブジェクトのメソッド本体内で、オブジェクトのメンバ変数を直接参照することができる。 しかし、メソッドの引数が同一名ならば、メンバ変数名を明確にする必要がある。

例えば、次の HSBColor クラスのコンストラクタは、コンストラクタに渡される引数に従ってオブジェクトのメンバ変数を初期化する。 コンストラクタへの各引数は、初期値を含むオブジェクトのメンバ変数と同一名である。

class HSBColor {
    int hue, saturation, brightness;
    HSBColor (int hue, int saturation, int brightness) {
        this.hue = hue;
        this.saturation = saturation;
        this.brightness = brightness;
    }

メンバ変数 hue と引数 hue を明確にしなければならないので、このコンストラクタでは this を使用しなくてはならない(他の引数も同様)。hue = hue; と書くのは意味がない。 引数は優先度が高く、同一名のメンバ変数を隠す。 これにより、メンバ変数を参照するために、明示的に現在のオブジェクト − this − を通して行わなくてはならない。

参照のあるメソッドを含むオブジェクトのメンバ変数を参照する際に、常に this を使用することを好むプログラマがいる。 これによってコードの主旨が明確になり、名前の共用に基づいたエラーが削減される。

現在のオブジェクトのメソッドを呼び出すためにもthis を使用する。 これは、メソッド名に曖昧さがある場合にのみ必要なだけであって、コードの主旨をより明確にするためにしばしば使用される。

super

メソッドがスーパークラスのメンバ変数を隠す場合、メソッドは super を使用してかげの変数を参照することができる。 同様に、メソッドがそのスーパークラスのメソッドをオーバーライドする場合、メソッドは super を使用してオーバーライドされたメソッドを呼び出すことができる。

次のクラスを例にとる。

class ASillyClass {
    boolean aVariable;
    void aMethod() {
        aVariable = true;
    }
}

そして aVariable を隠し、 aMethod() をオーバーライドするサブクラスも考慮する。

class ASillierClass extends ASillyClass {
    boolean aVariable;
    void aMethod() {
        aVariable = false;
        super.aMethod();
        System.out.println(aVariable);
        System.out.println(super.aVariable);
    }
}

最初に aMethod() aVariable (ASillyClass で宣言されたものを隠す ASillierClass で宣言した変数)を false に設定する。 次の aMethod() がこの文でオーバーライドされたメソッドを起動する。

super.aMethod();

これにより、 aVariable の隠されたバージョン(ASillyClass で宣言したもの)を true に設定する。 その時 aMethod が異なる値を持つ aVariable の両方のバージョンを表示する。

false
true

ローカル変数

メソッドの本体内で、そのメソッド内で使用する複数の変数を宣言することができる。 これらの変数はローカル変数であって、制御がメソッド内にある場合にのみ有効である。 次のメソッドが、その配列引数の要素に操作を繰り返すためにローカル変数 を宣言する。

Object findObjectInArray(Object o, Object[] arrayOfObjects) {
    int i;      // local variable
    for (i = 0; i < arrayOfObjects.length; i++) {
        if (arrayOfObjects[i] == o)
            return o;
    }
    return null;
}
このメソッドがリターンした後には、i はもう存在しない。


Previous | Next | Trail Map | Writing Java Programs | オブジェクト、クラス、インタフェース