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

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

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

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

Q&A

解決済

1回答

607閲覧

[Java]呼び出し先関数で配列を再代入した際に参照先が変わらない

haru86

総合スコア2

Java

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

0グッド

1クリップ

投稿2022/06/16 16:21

Javaで、配列型データの参照先を変更する際の挙動についてご教示いただきたいです。

配列は参照型のため、再代入によって、別の配列に変えることができると認識しております。
以下のコードのmain関数において、arrにarr2を再代入すると、arrの参照先がarr2になることを
確認できました。

ところが、これと同じ処理をsub関数で実行したところ、arrの参照先は変わりませんでした。
main関数およびsub関数内で、配列の参照先を確認して、呼び出し先と呼び出し元で同じで
あることを確認しております。

この事象の原因について、どのように解釈すればよろしいでしょうか。

Java

1import java.util.*; 2 3public class Main { 4 public static void main(String[] args) throws Exception { 5 int[] arr = new int[]{0,1,2}; 6 int[] arr2 = new int[]{3,4,5}; 7 System.out.println(arr); 8 System.out.println(arr2); 9 10 System.out.println(Arrays.toString(arr)); 11 12 sub(arr,arr2); // sub関数実行時点で、arr={0,1,2} 13 arr = arr2; // arr={3,4,5}となる。 14 System.out.println(Arrays.toString(arr)); 15 } 16 17 public static void sub(int[]arr, int[] arr2) { 18 System.out.println(arr); 19 System.out.println(arr2); 20 arr = arr2; 21 } 22}

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

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

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

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

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

guest

回答1

0

ベストアンサー

java のメソッド(java では通常"関数"とは呼びません)インターフェースは値渡しです。
main の arr と sub の arr は別の変数であり、 sub の呼び出し時に main の arr から sub の arr へ値がコピーされます。(sub.arr=main.arr な感じ。)
ですので、いくら sub 内で arr 自体を変えても main 側には影響しません。
int の引数があったとしてその引数の値をメソッド内で変えても呼び出し側は変わらないのと同じことです。

投稿2022/06/16 16:50

編集2022/06/16 17:10
jimbe

総合スコア12545

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

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

haru86

2022/06/16 17:56 編集

回答ありがとうございます。納得できました。 また、関数ではなく、厳密にはメソッドとのことで、次回から留意いたします。 ご指摘助かります。 引数が参照値であれば、参照渡しになるものだと誤認しておりました。 後学のため、Javaのメソッドにおける値渡しについて解説されている記事への リンクを以下に貼っておきます。 https://qiita.com/mdstoy/items/2ef4ada6f88341466783
jimbe

2022/06/16 18:32 編集

リンク先の記事を読ませて頂きました。 記事自体は普通(?)でしたが、記事に対するコメントが酷い有様で、コメントは途中で読むのを止めました(==; かみ合わない会話(?)が連なっていましたので、記事を読まれてもコメントまで読む際はご注意ください。
otn

2022/06/17 00:20

おそらく「参照渡しの言語を使ったことが無い人」が多いのが混乱の元なんでしょうね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問