プロが教える店舗&オフィスのセキュリティ対策術

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

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

と教えられました。

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

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

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

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

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

A 回答 (3件)

No1の方がおっしゃる通り、Javaでは全て値渡しです。


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

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

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

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

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

参考URL:http://java.269ch.jp/archives/2005/07/post_6.html
    • good
    • 0
この回答へのお礼

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

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

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

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

お礼日時:2006/10/23 14:43

>基本型を参照データ型にラップし、オブジェクトとして扱うことはできます。


の意味が「???」でした;

当初の質問からは脱線しますが・・・。
プリミティブ型(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/techsqua …
    • good
    • 1
この回答へのお礼

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

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

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

お礼日時:2006/10/23 20:29

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



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

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

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

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

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

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

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

お礼日時:2006/10/23 14:33

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!