Java の基本型は「値渡し」

0
334
views

Java の基本型では、外部メソッドへ引数を渡す方法として、「値渡し」という方法が使われます。

基本型の変数を引数にする

Java には、基本型(プリミティブ)と参照型があります。基本型では、値渡し(Call By Value)というメソッドの呼び出し方をします。

次のコードは、基本型の変数を引数にして外部のメソッドを呼ぶ典型的な例です。

public class CallByValue {
    public static void main(String... args) {
        int foo = 128;
        deliver(foo);
        System.out.println("int foo = " + foo);
    }
    private static void deliver(int bar) {
        bar = 256;
        System.out.println("int bar = " + bar);
    }
}

結果:

int bar = 256
int foo = 128

「値渡し」の特徴

上で挙げた例で、どんな現象が起こっているのか見てみます。

foo を引数としてメソッドに渡し、メソッド内でその引数を変更しようとも、元の変数 foo の値は変わりません。

どうして値が書き換わらないのか。外部メソッドに渡しているのが、変数の「実体」ではなく「値のみ」だからです。

内部処理のイメージ

では実際にメモリでどんなことが行われているか、処理を見てみます。

基本型変数の値は、メモリのスタック領域に格納されます。ヒープ領域は使いません。

スタック領域に格納されるデータは後入れ先出し(LIFO)なので、後入れした bar が上に来た状態でイメージを表現しています。

実引数 foo が bar に渡されますが、ここで渡されるのは値のみ。実体そのものではありません。

呼び出されたメソッドでは、渡された値を書き換えているだけ。foo の実体を書き換えているわけではありません。

間違ったイメージ

次の図は値渡しの間違ったイメージです。

間違ったイメージでは、foo の実体がメッソドに渡され、その値が書き換えられています。

このイメージでいくと、メソッドで受け取った引数を変更することで、元の変数も変わってしまうことになります。

しかし、Java の基本型ではこのようなことは行われません。また、このようなイメージを値渡しとは呼びません。