参照型の変数の使い方やメソッドの使い方を理解したところで、次にメソッドのパラメータが参照型か基本型かでどのような違いがあるのかを確認します。Sample90と同様にして、Sample93を作成してください。出来上がったSample93に水色部分を追加します(リスト5)。実行結果は画面4のようになります。
メソッドへ渡ってきたパラメータの型が参照型か基本型かによって、どんな違いがあるかを確認するために、文字列を編集したいのですが、実は一度作成したString型の文字列データは編集ができません。この文字列データを編集するために、JavaではStringBufferクラスが用意されています。そこで、StringBuffer 型の変数sbを用意し、String型の変数sの文字列を使ってインスタンスを作成しています。testメソッドの最初では、String型、StringBuffer型、char型の変数の各値を出力しています。sとsbはインスタンスが別ですが同じ文字列を表現しています。char型の変数cは“a”という文字リテラルで初期化しています。
test1メソッドのパラメータには、s、sb、cを渡しています。メソッドの最初に、パラメータとして渡ってきた変数の値を表示しています。実行してみると、testでのs、sb、cとtest1でのps、psb、pcが対応しているのが分かるはずです。test1メソッドでは、psには“5678”を代入し、psbに対しては“4567”の文字列をappendメソッドで追加し、pcには“b”という文字リテラルを代入しています。これらの処理をした後に、値を表示すると期待どおりの値になっています。つまり、psは“5678”、psbは“01234567”、pcは“b”となっています。
test1メソッドが終了してからtestメソッド内の変数の値を確認すると、s 、cは値が変わっていません。しかし、sbはtest1メソッド内での変更が反映されています。このことから、メソッドのパラメータが基本型か参照型かを意識する必要があることが分かるはずです。
パラメータ変数のうち、基本型の変数(pc)の値や、参照型の変数(ps)の値(参照値)はtest1メソッド内で変更しても、メソッドを呼び出した方(test)には影響がありませんでした。ところが、参照型の変数(psb)のメソッドを呼び出して値を変更した場合は、test1メソッドを呼び出した方(test)にも反映されて影響が出てきます。もちろん、メソッド内で参照型変数のフィールド値を変更しても同様に影響が出てきます。参照型について理解できていれば、これらのことは当たり前だと感じるはずです。しかし、こういった違いを忘れてプログラムを作成してしまうと、思ったとおりには動作しないプログラムが出来上がってしまいますから、忘れないようによく覚えておいてください。
s :0123
sb :0123
c :a
---------- test1 start
ps :0123
psb :0123
pc :a
ps :5678
psb :01234567
pc :b
---------- test1 end
s :0123
sb :01234567
c :a
今回は参照型について基本型との違いを含めて解説をしました。参照型の例としてStringクラスやStringBufferクラスの使用方法を紹介しました。また、メソッドのパラメータ変数が、基本型か参照型かを意識する必要があることについても説明をしました。今回は、これまで解説してきた基本型、クラスとインスタンス、メソッドについて確認する良い機会にもなったはずです。
これで参照型についての解説は終了といいたいところですが、実はJavaにはインターフェイスという重要な型があります。また型名にはパッケージというものが深く関係しています。次回はこのインターフェイスとパッケージについて解説をする予定です。
小山博史(こやま ひろし)
情報家電、コンピュータと教育の研究に従事する傍ら、オープンソースソフトウェア、Java技術の普及のための活動を行っている。Ja-Jakartaプロジェクト(http://www.jajakarta.org/)へ参加し、PMCの一員として活動を支えている。また、長野県の地域コミュニティである、SSS(G)(http://www.sssg.org/)やbugs(J)(http://www.bugs.jp/)の活動へも参加している。
Copyright © ITmedia, Inc. All Rights Reserved.