
メソッドの引数にオブジェクトを指定した場合、
それは「参照渡し」だと理解していました。
でも以下のプログラムでは、指定したオブジェクトに変化がありません。
public static void main(String[] args) {
BigDecimal b = new BigDecimal(1);
System.out.println(b);
test(b);
System.out.println(b);
}
public static void test(BigDecimal b) {
b = new BigDecimal(2);
}
出力は以下です。
-------------------------
1
1
-------------------------
どういうことでしょうか?
正しい知識をお教えください。
よろしくお願いします。

No.5ベストアンサー
- 回答日時:
public static void test(BigDecimal b) {
b = new BigDecimal(2);
}
この部分でnewされていますので、bの参照先があたらしいオブジェクトを参照するようにかわるはずですよね。そう考えてしまうのはわかります。
変数名がmain関数内と同じなので説明がしづらいので、下記のように変更させてください。
public static void main(String[] args) {
BigDecimal mainb = new BigDecimal(1);
System.out.println(mainb);
test(mainb);
System.out.println(mainb);
}
public static void test(BigDecimal testb) {
testb = new BigDecimal(2);
}
ここでtestbとmainbは同じアドレスであると思ってしまうと、勘違いしてしまいます。あくまでtestbとmainbはおなじアドレスを「参照している」のであり、同じアドレスではありません。
局所的に説明すると下記のような感じです。
-------------
mainb : 5454363
-------------
testb : 5454363
-------------
5454363 : 1
-------------
それをもって、
test関数内でtestbに新しいnew BigDecimalをおこなっても、
testbのアドレス参照先がかわるだけで、mainbにはなんの変更も行われません。
この説明でわからない場合は参考URLを読んでみてください。
参考URL:http://www.tec-q.com/note/2007/04/_java_13.html
No.4
- 回答日時:
>指定したオブジェクトに変化がありません。
そもそも別のオブジェクトを参照しています。
このような場合は"フィールド変数"を使いましょう。
"フィールド変数"はひとつのクラス内で共通に使える変数です。
そして、メソッドの引数として宣言するのは
"局所変数"といいそのメソッド内でしか使えません。
つまり,"局所変数のb"と"フィールド変数のb"は別物となります
public class Test{
//フィールド変数
private static BigDecimal b;
public static void main(String[] args){
b=new BigDecimal(1);
System.out.println(b);
test(b);
System.out.println(b);
}
//メソッドの引数bは局所変数
//当メソッドの外では使えない
public static void test(BigDecimal b){
//なのでTestクラスのフィールド変数bを参照
Test.b=new BigDecimal(2);
}
}
No.3
- 回答日時:
メソッドの仮引数に格納されるのは、あくまで実引数のコピー。
つまりそういう意味では「値渡し」です。
ここでは引数にオブジェクトすなわち参照型の値を受け渡しされているけれど、int型などのプリミティブな値を受け渡しする場合と機構的には同じだと考えればよいと思います。
No.2
- 回答日時:
一旦Javaは忘れてC言語へ。
間違っていたら指摘よろしくお願いします>識者様
int main(){
int i = 5;
func(i);
printf("%d",i); //5
}
void func(int a){
// mainのiとaは同じ値が違う領域に入っている。== 値渡し
a = 3;
}
===========================
int main(){
int * x; // int *型。実際には無いと思うけど,JavaのGenerics使ってpointer<T> で Tがintになっているって説明した方が解る?
x = (int *)malloc(sizeof(int));
//メモリの領域にint型の大きさの部分が確保され,そのアドレスが返る。
//実際には確保しようとしたらメモリ不足だった、ということもあるが,その処理は書かない。
*x = 10; //アドレスの指す先の領域(int型)に値を代入。
func(x);
printf("%d",i); //20
free(x); //確保した領域を解放。
}
void func(int * a){
*a = 20;
}
全く同じ。mainのxとaも同じ値(int *のアドレス)が違う領域に入っている。
アドレスが指す領域(int型)は同じ。 int *型の値渡し == int 型の参照渡し
*aに20を突っ込んだから20が表示された。
*aではなくaに別の値を突っ込んだ場合,
aは変わるが,*aの内容は変わらない。→xは元の値を保ったまま。*xの値も変わらない。
No.1
- 回答日時:
元のオブジェクトを書き換えてませんよね?
bがBigDecimal(1)を指していたところに、別途BigDecimal(2)のオブジェクトを作って、bがそっちを指すようにしただけ。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java java final 1 2022/06/10 22:49
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- Java Java プログラム public class Main { public static void 3 2023/08/10 23:46
- Ruby 【JAVA】数字をひし形に出力するプログラムについて 2 2022/07/11 23:32
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- C言語・C++・C# Windows Formアプリからコンソールを呼び出して文字を出力させたい 8 2023/05/09 10:53
- Java JavaのSingletonパターンのprivateの持つ意味が分かりません。 5 2022/06/12 10:38
- C言語・C++・C# C# DatagridviewにExcelシートを反映するとエラーが出る 2 2023/05/06 17:12
- C言語・C++・C# 大量のデータを読み込んで表示する速度を改善したい 8 2023/05/07 13:29
- Java 直し方について教えて頂きたいです。 4 2022/08/13 02:11
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
servletからjspへオブジェクト...
-
オブジェクト、プロパティ、メ...
-
サーブレットコンテキストの意...
-
Excel VBA 定数にオブジェクト...
-
エクセルVBA 画像を貼り付ける...
-
C#で親にイベントを投げる方法
-
オブジェクト指向プログラミン...
-
VBSのGetFolderメソッドについ...
-
setTimeは、返り値がなぜ不要な...
-
Stringクラスの文字列の内容
-
ArrayListでの要素の取り出し
-
C++/CLIでの画像情報(RGB)の取得
-
エクセルVBA/SpecialCellsで特...
-
VBS でのソート処理Excel2003
-
String型からlong型への変換は...
-
他クラスのすごくかっこいい同...
-
「タイプ初期化子が例外をスロ...
-
main()を持つクラスが2つ以上...
-
エクセルVBAで、条件に一致する...
-
private static という変数の修飾
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルVBA 画像を貼り付ける...
-
Excel VBA 定数にオブジェクト...
-
サーブレットコンテキストの意...
-
C#のクラスで値渡しをする
-
VB.netでメソッドからコントロ...
-
servletからjspへオブジェクト...
-
エクセルVBA/SpecialCellsで特...
-
Vba ListViewの行挿入に関して...
-
C#で親にイベントを投げる方法
-
MessageBox.Show(Me,…の「Me」...
-
String型からlong型への変換は...
-
VB.NETでのnothing の意義について
-
UTF-8のテキストファイルを開く...
-
System.Collections.SortedList
-
javaで、、、
-
C#でのExcel操作について.(Ran...
-
VBSのGetFolderメソッドについ...
-
JSPでのArrayListの表示につい...
-
ピクチャーボックスに点を打つ...
-
VBAでの[]
おすすめ情報