SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

HRzine Day(エイチアールジン・デイ)は、人が活き会社が成長する人事のWebマガジン「HRzine」が主催するイベントです。毎回、人事の重要課題を1つテーマに設定し、識者やエキスパードが持つ知見・経験を、参加者のみなさんと共有しています。

直近開催のイベントはこちら!

HRzine×SmartHR 人材・組織活性化フォーラム

2024年12月6日(金)13:00~15:30

主要製品スペック一覧

人事業務の効率・確度・精度を高めるために欠かせないHRテクノロジー。その主な製品の機能を分野ごとに比較できる資料群です。製品検討の参考資料としてご活用ください。

eラーニング・LMS<br>主要製品スペック一覧 2024

eラーニング・LMS
主要製品スペック一覧 2024

その他のスペック一覧

人事労務管理システム<br>主要製品スペック一覧 2023

人事労務管理システム
主要製品スペック一覧 2023

タレントマネジメントシステム<br>主要製品スペック一覧 2023

タレントマネジメントシステム
主要製品スペック一覧 2023

みちこ先生のオラクル認定Javaプログラマ Silver SE 7/8 合格コース | 第1回

【認定Java Silver】値コピーと参照情報のコピーを習得する


  • Facebook
  • X
  • Pocket
  • note
  • hatena

図1.引数に基本データ型を使用する
図1.引数に基本データ型を使用する

図1のとおり、メソッド呼び出し側とメソッド定義側では、num変数という同じ名前を使用していますが、領域は別々に確保され、値自体(ここでは「10」)のコピーが渡されます。したがって、メソッド定義側で値を変更しても、メソッド呼び出し側に影響することはありません。

では、もしメソッド定義側であるmethod1()メソッドで加算した結果である「20」をmain()メソッド側で使用したい場合には、どうしたらいいでしょうか。

これは、戻り値でmain()メソッド側に返せばOKです。Sample1クラスを修正したコードを見てみましょう(Sample2.java)。

■Sample2.java
public class Sample2 {
  public static void main(String[] args) {
    int num = 10;
    num = method1(num); //method1()呼び出しの戻り値をnum変数に再代入する
    System.out.println("mainメソッド側:" + num);
  }
  public static int method1(int num) { //戻り値の型をint型で宣言
    num += 10;
    System.out.println("method1メソッド側:" + num);
    return num;  //return文でnum値を返す
  }
}
■Sample2.javaの実行結果
prompt>java Sample2
method1メソッド側:20
mainメソッド側:20

7行目のmethod1()メソッドでは、戻り値の型を「void」から「int」が変更されています。また、10行目で処理結果であるnum値をreturn文で返すように変更されました。こうして返されてきた値を、main()メソッドの4行目ではnum変数に再代入しています。

参照型の場合

次に、参照型の動きをサンプルコードで確認してみましょう。このサンプルは、メソッドの引数に基本データ型であるint型の配列を使用します(Sample3.java)。ポイントは、配列に格納する値が基本データ型であっても、配列自体は参照型として扱われる点です。

■Sample3.java
public class Sample3 {
  public static void main(String[] args) {
    int[] ary = {10};
    method1(ary);
    System.out.println("mainメソッド側:" + ary[0]);
  }
  public static void method1(int[] ary) {
    ary[0] += 10;
    System.out.println("method1メソッド側:" + ary[0]);
  }
}

3行目でint型の配列を用意しています。配列には1つ(値は10)だけ、要素を入れています。ここのary変数は、配列を指し示す参照型として扱われることに注意してください。4行目ではmethod1()メソッドの呼び出し時に、このary変数を指定しています。

8行目では、メソッドの引数で受け取った配列の1番目の要素に10を加算し、9行目で「20」の出力後、処理は呼び出し元に戻り5行目が実行されますが、出力結果は「20」となっています。

■Sample3.javaの実行結果
prompt>java Sample3
method1メソッド側:20
mainメソッド側:20

基本データ型を使用したSample1.javaサンプルとは実行結果が異なりますね。 これは、メソッドの引数や戻り値に参照型を使用した場合、参照情報のコピーがやり取りされるからです。

参照型変数には、実体となるオブジェクトを指し示す情報(つまりメモリアドレスのようなもの)が格納されています。引数や戻り値に参照型変数を使用すると、オブジェクト自体のコピーではなく、「この場所を指し示してますよ」という参照情報のコピーがやり取りされれます。その結果、異なる位置(異なる参照変数)から同じオブジェクトにアクセスすることになります。

図2.引数に参照型を使用する
図2.引数に参照型を使用する

このように、メソッドの引数に基本データ型の変数で値を渡した場合、呼び出し先であるメソッド内の処理で引数の値を変更しても、呼び出し元の変数の値は変更されません。一方、参照型の変数で値を渡した場合、参照を使ってメソッド内でも同じオブジェクトを参照するため、呼び出し先であるメソッド内で値を変更すると、呼び出し元の変数が指す値も変更されます。この挙動は、戻り値で使用した場合も同じです。

次のページ
模擬問題に挑戦!

この記事は参考になりましたか?

  • Facebook
  • X
  • Pocket
  • note
  • hatena
みちこ先生のオラクル認定Javaプログラマ Silver SE 7/8 合格コース連載記事一覧

もっと読む

この記事の著者

山本道子(ヤマモト ミチコ)

2004年Sun Microsystems社を退職後、有限会社Rayを設立し、システム開発、インストラクタ、執筆業などを手がける。著書に『オラクル認定資格教科書 Javaプログラマ Bronze SE 7/8』『同Silver SE 8』『同Gold SE 8』のほか、『SUN教科書 Webコンポーネントディベロッパ(SJC-WC)』、『携帯OS教科書 Androidアプリケーション技術者ベーシック』、『Linux教科書 LPICレベル1 スピードマスター問題集』(共著)、監訳書に『SUN教科書 Javaプログラマ(SJC-P)5.0・6.0 両対応』(いずれも翔泳社刊)などがある。月刊誌『日経Linux』(日経BP社刊)でLPIC対策記事を連載。日々の楽しみは晩酌、好きな言葉は表面張力。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事をシェア

  • Facebook
  • X
  • Pocket
  • note
  • hatena
HRzine
https://hrzine.jp/article/detail/8 2016/06/07 20:00

Special Contents

AD

Job Board

AD

おすすめ

アクセスランキング

アクセスランキング

イベント

HRzine Day(エイチアールジン・デイ)は、人が活き会社が成長する人事のWebマガジン「HRzine」が主催するイベントです。毎回、人事の重要課題を1つテーマに設定し、識者やエキスパードが持つ知見・経験を、参加者のみなさんと共有しています。

2024年12月6日(金)13:00~15:30

イベントカレンダーを見る

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング