Javaコラム Javaエンジニアのためのお役立ちコラム

Javaは参照渡しがないの?他の言語との違いについてもご紹介

2021年08月31日
SE
Javaの参照渡しとはどのようなことなのでしょうか。
PM
Javaでいう参照渡しは変数の参照先(アドレス)を渡すことを言います。

Javaには参照渡しがない⁉他言語との違いやString型の書き換え方も解説します!


C/C++をはじめ、C#、VB.net、果てはExcel VBAにも存在している「参照渡し」ですが、Javaには「参照渡し」が存在しません。

ただし、Javaでも「参照渡し」に似たような処理は作れます。また、Javaではこの処理を「参照の値渡し」と呼ぶこともあるため、余計に混乱してしまう方も多いのではないでしょうか。

本記事では、Javaと他言語(主にC#)に触れながら、Javaの「参照渡し」について紹介していきます。

そもそも『参照渡し』とは? 参照渡しの概念について説明します

まず、そもそも「参照渡し」とはどういう概念なのか見て行きましょう。なお、他言語にて、充分に理解されている方は読み飛ばしていただいて構いません。

まず、「参照渡し」を語る上で,欠かせない相棒は「値渡し」です。

「値渡し」とは値を渡すもので、「参照渡し」とは参照先を渡すものと、読んで字のごとしですが、抽象的すぎてイメージが難しいと感じる方も多いことでしょう。

以下で詳しく解説しましょう。

値渡し

先述の通り、値渡しとは「値を渡すもの」です。

もう少し詳しく説明すると「値(プリミティブ)型の中身をコピーして渡すもの」です。

ちなみに、値(プリミティブ)型は、「boolean、byte、char、short、int、float、long、double」の8つです。

「値のコピーを渡すから値渡し」と考えれば覚えやすいでしょう。

実際にソースコードで見てみましょう

実行結果は次のようになります

changeValueには、値“111”を渡しているので、書き換えることはできません。

参照渡し

対して、参照渡しとは「参照先を渡すもの」だと先述しました。もう少し詳しく説明すると、「変数のアドレスを渡すもの」です。

値渡しの時は、値(プリミティブ)型にする必要がありましたが、参照渡しはアドレスを渡すので、基本的にはどんな型でも渡すことができます。

「変数の参照先(アドレス)を渡すから参照渡し」と考えれば覚えやすいでしょう。

なお、Javaには参照渡しはありませんので、ここでは「参照渡しのようなもの」のソースコードを紹介します。

実行結果は次のようになります

changeValueには、book1のアドレス値を渡しているので、値が777に書き換えられて戻ってきます。

なぜJavaには参照渡しがないの?

ここでは、先ほど紹介したソースコードに、不可解なコードを追加しています。

「changeValue」と「NewValue」の違いは何かを考えながら、こちらのソースコードを見てみてください。

これを実行すると

となります。
つまり、changeValueとNewValueの違いは「新しいオブジェクトを割り当てようとした」ことです。

Javaでは、オブジェクトを初期化しようとすると、今までの領域はそのままにして新しい領域を確保してしまうことを覚えておきましょう。

上記のソースコードを抜粋して説明します。

さらに、C#で見ると違いが分かりやすいです。

C#では「ref」を付ければ参照渡しになりますが、Javaには「ref」のような仕組みがありません。よって「Javaには参照渡しがない」ということになります。

Javaの参照渡しでString型を変更する方法


ここまでJavaの参照渡しについて紹介してきました。Javaでは「参照渡し」自体はないものの、似た処理は作れました。

続いて、「JavaのString型を参照渡しして、値を変更して戻す」という処理について見てみましょう。

JavaのString型は「immutable な(状態を変えられない)」特殊なオブジェクトです。そのため、次のようなソースコードを書いても、addString内で変更した文字列は戻ってきません。

これは「str = str + “World.”;」の時点で、新しい領域を確保してしまうからです。
なので、元のstrは何も変更されていない。という結果になります。

もし、addString内で変更した文字列を戻したい場合は「StringBuilder」もしくは「StringBuffer」を使ってください。

先ほどのソースコードを「StringBuilder」を使って書き換えると、こうなります。

SE
Javaでは参照渡しという概念ではないので、参照の値渡しと覚えれば良いのですね。
PM
参照の値渡しへの理解をより深めるために、Javaで実践してみましょう。

Javaで参照の値渡しを使ってみよう!


本記事では、「Javaの参照渡し」について紹介してきました。

Javaは基本的には値渡しになるので、メソッドで値を変えて戻す、という処理を作るには少し考慮が必要です。

他言語に慣れていると、どうしても「参照渡し」という言葉を使いたくなるでしょうが、Javaには参照渡しはありません。

Javaを用いる場合は、「参照の値渡し」を使いこなせるよう、本記事を参考にしてください。


Javaでのキャリアアップをお考えの方は、現在募集中の求人情報をご覧ください。

また、直接のエントリーも受け付けております。

エントリー(応募フォーム)

Search

Popular

recommended

Categories

Tags