こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

javaでは基本型の参照渡しは無理ですか?

先日のjavaの授業で値渡しと参照渡しについて学びました。
授業では

オブジェクトは参照渡しになり
基本型は値渡しにされる(参照渡しは不可能)

と教えられました。

オブジェクトを値渡しにできないのはなんとなく納得できたのですが
基本型を参照渡しにできないのが納得できません。

そこで
1.基本型を参照渡しにすることはできないのか?

2.基本型を参照渡しすることができないのはなぜか?

3.オブジェクトを値渡しすることができないのはなぜか?

の3点を教えて頂きたいです。
よろしくお願いします。

投稿日時 - 2006-10-23 12:04:33

QNo.2491624

困ってます

質問者が選んだベストアンサー

No1の方がおっしゃる通り、Javaでは全て値渡しです。
オブジェクトは参照データ型といわれる型になります。
参照渡し、と思っているのは【参照を示す場所を値渡ししている】になります。
わかりやすく説明されているサイトをご紹介します。

という前提で疑問に私なりの回答をしてみます。

1.基本型を参照渡しにすることはできないのか?
  基本型を参照データ型にラップし、オブジェクトとして扱うことはできます。例をあげるとbooleanではBooleanオブジェクトに該当します。
  
2.基本型を参照渡しすることができないのはなぜか?
  1.のような方法で【Natsu0611さんが思われているような参照渡し】は可能ではないでしょうか。

3.オブジェクトを値渡しすることができないのはなぜか?
  おそらくではありますが、メモリ管理の問題ではないでしょうか。

回答が合っているかどうかはちょっと自信は無いですが・・・。

参考URL:http://java.269ch.jp/archives/2005/07/post_6.html

投稿日時 - 2006-10-23 13:47:51

お礼

わかりやすく説明されているサイトまで教えて頂きありがとうございます。

早速行ってみるとサンプル付きで説明されていて大変わかりやすかったです。

ですがjavaを学び始めてまだまだ日が浅いせいか
>基本型を参照データ型にラップし、オブジェクトとして扱うことはできます。
の意味が「???」でした;

お忙しいところお手数をかけてしまい申し訳ありませんが
もしよろしければ説明をお願いできないでしょうか?;

投稿日時 - 2006-10-23 14:43:16

このQ&Aは役に立ちましたか?

3人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

>基本型を参照データ型にラップし、オブジェクトとして扱うことはできます。
の意味が「???」でした;

当初の質問からは脱線しますが・・・。
プリミティブ型(intやbooleanなど)は所謂オブジェクトではありません。

そこからどのような問題が発生するかですが、

例えばintの配列を作成したいと思います。
しかし、そのintの配列は何個用意していいかわからず可変に扱いたい。
Javaでは配列のサイズは宣言時(厳密には異なるが)により確定されてしまいますので、可変で扱いたいときはCollectionインターフェース等を使用します。
しかし、Collectionが持つaddやremoveの引数型はObjectです。つまりプリミティブ型は渡すことが出来ません。
-----------------------------------------
int i = 1;
Collection c = new ArrayList();
c.add(i) ← 出来ない
-----------------------------------------
(*J2SE5.0以降はAutoBoxingにより可能。しかし注意が必要。)

これを実現するためにプリミティブ型にはラッパークラスが用意されています。
intならばIntegerクラス、booleanならばBooleanクラス・・・。といったものです。
つまり、プリミティブ型をObjectとして扱う方法を実現するのです。
-----------------------------------------
int i = 1;
Integer iI = new Integer(i); ←intをIntegerクラスにラップ
Collection c = new ArrayList();
c.add(iI) ← 可能
-----------------------------------------
以上がラッパークラスの基本的な役割になります。AutoBoxingに関してはさらに解説が長くなるので割愛させていただきます。改めてご質問ください。

さて、当初の疑問点に関してですが、もう少し突っ込んだところでの解説をしているサイトがありました。ご参考ください。

参考URL:http://itpro.nikkeibp.co.jp/members/NBY/techsquare/20030117/1/

投稿日時 - 2006-10-23 16:27:59

お礼

当初の質問と違う内容のものまで詳しく説明して頂きありがとうございます。

まだなんとなく理解という状態なので再度教えて頂いたURLの内容を理解しながら
javaへの理解を深めていきたいと思います。

回答本当にありがとうございました。

投稿日時 - 2006-10-23 20:29:18

ANo.1

Javaに「参照渡し」はありません。

「オブジェクトは参照渡しになり」というのは一見、そのように見えますが、
参照している値を渡しているのにすぎず、これも値渡しです。

例えば、呼び出し先でnewしなおした場合は、結果は反映されません。
変数は、本体(配列の実態など)が 格納されているアドレスを持っているに過ぎず、
引数はそのアドレスのコピーが渡されます。

つまり、 インスタンスのアドレスという値が渡されているため、一見、参照渡し
に思えますが、変数の値(アドレス)を書き換え(newしなす)ても、呼び出し
元には影響しません。

投稿日時 - 2006-10-23 13:01:44

お礼

迅速な回答ありがとうございます。

>Javaに「参照渡し」はありません。
の一言にビックリしました!!

ですが、わかりやすい説明を読んで納得できました!

迅速かつわかりやすい丁寧な回答本当にありがとうございました。

投稿日時 - 2006-10-23 14:33:34

あなたにオススメの質問