質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

4回答

575閲覧

値渡しと参照渡しについて

kobe2018

総合スコア21

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2020/06/24 08:27

値渡しと参照渡しの違いについて。
java初学者です。
以下のソースコードの実行結果がなぜそうなるのか、理解できません。
参照渡しは値を代入すると元の値も更新されると理解しています。
なぜ出力結果は3,4,5ではないのでしょうか。

該当のソースコード

Java

1Public class Main{ 2 Public static void main(String[] args{ 3 int[] array = { 1, 2, 3}; 4 methodA(array); 5 for(int value : array){ 6 System.out.println(value); 7 } 8 9public static void methodA(int[] array){ 10 array = new int[]{3, 4, 5};

実行結果

1
2
3

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

ベストアンサー

https://teratail.com/questions/271922
ちょうど最近、似たような質問をしたので復習を兼ねて絵に纏めてみました。
イメージ説明

投稿2020/06/24 09:05

torisan3

総合スコア50

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

methodA内のarray変数は新たな配列であるnew int[]{3, 4, 5}を参照するようになっているだけで、
元々あった{ 1, 2, 3}のインスタンスには何の影響もないからです。

ご期待の通りに動かしたいのであれば、以下のようになります。

Java

1public static void methodA(int[] array) { 2 array[0] = 3; 3 array[1] = 4; 4 array[2] = 5; 5}

Javaは厳密に言うと参照渡しと言うものはなく、参照値(そのインスタンスがどこにあるかという情報)の値渡しというものになります。
ちょっと難しいんですが。。。

array = new int[]{3, 4, 5}; というのは、array変数を新たな参照値で上書いています。
前述した通り、参照値は値渡しされますのでmethodA内で変更されたとしても、
呼び出し元のarray変数が保持している参照値には影響がないわけです。

それと比べて、私が上記で書いたコードは、元々持っていた参照値が示すインスタンスの内容を変えているため、呼び出し元にも影響があるということになります。

投稿2020/06/24 08:42

root_jp

総合スコア4666

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

提示のコードは値渡しです
main関数のなかのarrayの値をmethodAに渡して、その中でarrayを書き換えてますが、値渡しのため、それは呼び出し元には影響されません

投稿2020/06/24 08:41

y_waiwai

総合スコア88042

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

参照渡しは値を代入すると元の値も更新されると理解しています。

Javaには、そういう意味での「参照渡し」は存在せず、参照の値渡しが行われます。

  • オブジェクトを破壊的に変更する→呼び出し元と同じオブジェクトを参照しているので、変更は呼び出し元にも影響する
  • オブジェクトを別なものに入れ替える→呼び出し元には影響しない

投稿2020/06/24 08:36

maisumakun

総合スコア146018

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2020/06/24 08:38

Javaは参照型の引数の渡し方が1通りなのですが、PHPやC#のように、参照型も値渡し/参照渡しを選べる言語もありますので要注意です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問