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

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

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

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

Q&A

解決済

2回答

667閲覧

メソッド内で処理されたフィールドの値はどうなっているのか

kobe2018

総合スコア21

Java

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

0グッド

0クリップ

投稿2020/06/27 13:36

前提

・クラス:Calculate
・フィールド:
①ClassNumber(クラスフィールド)
②instanceNumber(インスタンスフィールド)
・メソッド
①addNumber() フィールド①、②にそれぞれ1を加える
②substNumber() フィールド①、②からそれぞれ1を引く

発生している問題・エラーメッセージ

ソースコードでclassNumberとinstanceNumberの値が更新されるのがいまいち納得できません。
以前、javaの基本型変数は値渡し、参照型は参照の値渡しだということを学びました。
値渡しだから値は更新されないのではないでしょうか。

私の理解は以下の通りです。
①フィールドのclassNumberとinstanceNumberはメソッドのaddNumber()やsubstNumber()に値のみ渡している。
②そのため、メソッドで値が変更されようとも元のclassNumberやinstanceNumberには変更が反映されない。

しかし、実際にはメソッド内での値の変更が元のインスタンスにも反映されています。
この仕組みを教えて頂けるとありがたいです。

該当のソースコード

java

1package sitsumon0627_2; 2 3public class Calculate { 4 //フィールド 5 static int classNumber; 6 int instanceNumber; 7 8 //加算 9 public void addNumber() { 10 Calculate.classNumber++; 11 this.instanceNumber++; 12 } 13 14 //減産 15 public void substNumber() { 16 Calculate.classNumber--; 17 this.instanceNumber--; 18 } 19} 20

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

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

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

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

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

BluOxy

2020/06/27 13:40 編集

> 以前、javaの基本型変数は値渡し、参照型は参照の値渡しだということを学びました。 それは、こちらで違いないでしょうか。 https://teratail.com/questions/272551
kobe2018

2020/06/27 13:52

はい、それです。
guest

回答2

0

ベストアンサー

前回の質問では、メソッドの引数に参照値がコピーして渡されています。

ですから、下記methodAの中でarrayのインスタンス自体を上書き(すなわち、既にコピーされた参照値を上書き)しても呼び出し元のmethodAに渡した引数に影響は何もありません。

java

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

一方、この質問に添付されたコードではそのような手続きは存在せず、Calculateやthisという参照値を直接参照していますから、instanceNumberの変更がインスタンスに反映され、classNumberの変更がクラスに反映されます。

投稿2020/06/27 14:03

BluOxy

総合スコア2663

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

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

kobe2018

2020/06/27 14:06

引数は参照の値渡し。 今回のは直接参照。 そこが違いということですね!
guest

0

javaの基本型変数は値渡し、参照型は参照の値渡しだということを学びました。

考え違いしています。
これはメソッドの引数のことを言ってます
あなたの提示されている変数はいずれも引数ではありません。

投稿2020/06/27 13:43

y_waiwai

総合スコア88042

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

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

kobe2018

2020/06/27 14:05

ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問