• ベストアンサー

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

先日のjavaの授業で値渡しと参照渡しについて学びました。 授業では オブジェクトは参照渡しになり 基本型は値渡しにされる(参照渡しは不可能) と教えられました。 オブジェクトを値渡しにできないのはなんとなく納得できたのですが 基本型を参照渡しにできないのが納得できません。 そこで 1.基本型を参照渡しにすることはできないのか? 2.基本型を参照渡しすることができないのはなぜか? 3.オブジェクトを値渡しすることができないのはなぜか? の3点を教えて頂きたいです。 よろしくお願いします。

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

  • ベストアンサー
回答No.2

No1の方がおっしゃる通り、Javaでは全て値渡しです。 オブジェクトは参照データ型といわれる型になります。 参照渡し、と思っているのは【参照を示す場所を値渡ししている】になります。 わかりやすく説明されているサイトをご紹介します。 という前提で疑問に私なりの回答をしてみます。 1.基本型を参照渡しにすることはできないのか?   基本型を参照データ型にラップし、オブジェクトとして扱うことはできます。例をあげるとbooleanではBooleanオブジェクトに該当します。    2.基本型を参照渡しすることができないのはなぜか?   1.のような方法で【Natsu0611さんが思われているような参照渡し】は可能ではないでしょうか。 3.オブジェクトを値渡しすることができないのはなぜか?   おそらくではありますが、メモリ管理の問題ではないでしょうか。 回答が合っているかどうかはちょっと自信は無いですが・・・。

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

お礼

わかりやすく説明されているサイトまで教えて頂きありがとうございます。 早速行ってみるとサンプル付きで説明されていて大変わかりやすかったです。 ですがjavaを学び始めてまだまだ日が浅いせいか >基本型を参照データ型にラップし、オブジェクトとして扱うことはできます。 の意味が「???」でした; お忙しいところお手数をかけてしまい申し訳ありませんが もしよろしければ説明をお願いできないでしょうか?;

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

回答No.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/
Natsu0611
質問者

お礼

当初の質問と違う内容のものまで詳しく説明して頂きありがとうございます。 まだなんとなく理解という状態なので再度教えて頂いたURLの内容を理解しながら javaへの理解を深めていきたいと思います。 回答本当にありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • dyna_1550
  • ベストアンサー率34% (122/353)
回答No.1

Javaに「参照渡し」はありません。 「オブジェクトは参照渡しになり」というのは一見、そのように見えますが、 参照している値を渡しているのにすぎず、これも値渡しです。 例えば、呼び出し先でnewしなおした場合は、結果は反映されません。 変数は、本体(配列の実態など)が 格納されているアドレスを持っているに過ぎず、 引数はそのアドレスのコピーが渡されます。 つまり、 インスタンスのアドレスという値が渡されているため、一見、参照渡し に思えますが、変数の値(アドレス)を書き換え(newしなす)ても、呼び出し 元には影響しません。

Natsu0611
質問者

お礼

迅速な回答ありがとうございます。 >Javaに「参照渡し」はありません。 の一言にビックリしました!! ですが、わかりやすい説明を読んで納得できました! 迅速かつわかりやすい丁寧な回答本当にありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 参照渡し

    javaでintやStringって参照渡しって可能なのでしょうか? プリミティブタイプ以外は参照渡しとあるサイトに書いてあったのですが Stringは何故、値渡しなのでしょうか。 宜しくお願いします。

    • ベストアンサー
    • Java
  • PHP5での参照渡しについて

    お世話になっております。 3点質問させて下さい。 1.PHP5での参照渡しについて PHP5では、参照渡しがデフォルトという記事を読んだのですが、classを使わず、以下のようにfunctionのみで記述した場合、参照渡しになっている気配がありません。 - $test = "テスト"; function a($a){ $a = "参照渡し"; } a($test); echo $test; - 結果:テスト &$aとすると参照渡しになりますが、classを使わない場合はPHP5のデフォルトが参照渡しというのを意識する必要は無く、&を用いた参照渡しを利用する形で良いのでしょうか? 2.オブジェクトについて オブジェクト=class だと思っても良いのでしょうか? また、独立した関数では無く、classを利用した方が良い場面というのはどういう時なのでしょうか? classやオブジェクト指向というものへの私の理解が足りてない事でこのような疑問を抱く事になっていると思います。 classやPHP5のオブジェクト指向について学習するのに便利な書籍やサイトなどあれば紹介して頂けないでしょうか? 3.$_POSTや$_GETについて 他の方のソースを見ていると、何かの処理後にPOSTの値を別の変数に入れている方が多いように思えます。 私もそれにならってPOSTの値をいじる場合は、 変数 = 関数($_POST["test"]); とするようにしています。 ですが、 $_POST["test"] = 関数($_POST["test"]); とするのは何か都合が悪い事があるのでしょうか? 要領を得ない質問で申し訳ありませんが、回答頂けましたら嬉しいです。

    • ベストアンサー
    • PHP
  • PHPの参照渡しについて

    以下のようなコードがあったとき $obj = new stdClass(); $foo = $obj; この場合、動作は いわゆる【参照の値渡し】というとらえかたでよいのでしょうか? 変数$obj には、 new stdClass();という記述によって 新規に作成されたオブジェクトの参照(※正確には別のメモリ内に保持されたオブジェクトのアドレス) が保持されるわけですよね? そのとき $foo = $obj; というコードは$objが保持するオブジェクトのアドレス値を$fooという変数にも コピーするという動作を意味するわけですよね。 この場合、両変数を用いて生成されたオブジェクトのプロパティなどの状態を 共有することとができます。 しかしながら変数$fooに別の値、例えば文字列を代入すうると $foo = "文字列"; とすると$fooの値が変更され$objの値は変更されません。 対して、次のようなコードがあった場合 $foo = &$obj; というコード、これはPHPにおける参照渡しですが、 この場合は$objが指し示す、オブジェクトが保持されているメモリ上のアドレスではなく そのメモリ上に確保された変数$objそのもののアドレスが$fooという変数にコピー? されるのでしょうか? この明示的な参照渡しだと、オブジェクトの状態を共有するのはもちろん $foo = "オブジェクト破棄"; と片方に文字列を代入すると print $obj; 同様に文字列にかわってしまいます。 この本来の意味?であろう参照渡しとは実際 $fooに変数$objそのもののアドレスが保持されるという 解釈でよいのでしょうか? おくわしいかたご教授ください。

    • ベストアンサー
    • PHP
  • PHPは何故値渡しより参照渡しの方が遅いのでしょうか。

    PHPは何故値渡しより参照渡しの方が遅いのでしょうか。 値渡しの場合全て内容をコピーしなければならないので遅くなるように思うのですが。

    • ベストアンサー
    • PHP
  • 参照渡しやリファレンスを返す事について

    今疑問に思っているのが、「&」を付ける全ての事象についてす。 今まで参照渡しの方が効率や都合が良い場合にしか利用していませんで したが、「特に値渡しで構わない場合も、参照渡しにした方が良いの か?」という事から出てきた疑問です。 引数の値を直接操作する事はあまり良くない、と言われるのはこの辺の 絡みだと思うのですが、仮に関数内で引数の値を再セットする事を 忠実に守っていた場合、値渡しより常に参照渡しである方がメモリ 効率は良いと思います。(結局関数内で値渡しをする為、消費量としては 大きいと思いますが) 個人的には必要のある時にしか参照渡しを行わないという考えを変えるつもりは ありませんが(それが妥当な目的と利用法であると思うので)、 プロな方としてはどうなのかな、という事を思ってしまったのです。 次に、仮に変数同士で行った場合、ポインタもどきの動作をしている 事から、意味合いは通じるのですが、インスタンスを生成する場合や そのメソッドを呼び出して戻り値がオブジェクトの場合に見受けられます。 (マニュアルを見るとPHP5の場合、インスタンス生成時にそれを利用する 事は非推奨のようですが) 疑問なのは、インスタンスを初めて生成してオブジェクトが作られているのに 「&」で何を参照しに行っているのか?(クラスという雛形?) メソッドが終了したら内部の変数は開放されると思うが、それを参照 する事が何故可能なのか? リファレンス元をunset()してもリファレンス先が消えない事と同じ意味か? そういうものだと言ってしまえばそれでおしまいですが、 そういう疑問があるせいか、それの使いどころが分かりません。 加えてメソッドに関しては、呼び出し時に「&」をつけていたり メソッドの定義自体に「&」があったりして、使い方が分かりません。 呼び出し時の「&」は戻り値の参照でしょうけど、メソッド定義自体の 「&」が意味不明です。 ここばっかりはマニュアルを見ても理解出来ませんでした。 定義の参照って?という感じで考えが止まってしまいます。 (呼び出し時は、require等がされた時点でメモリで格納されている対象を見ている、という事なのか?) どなたかご教示願います。 今、かなりPHPについて悩んできてしまいました(笑)

    • ベストアンサー
    • PHP
  • javaで参照そのものを値として取得する事は出来ますか?

    javaで参照そのものを値として取得する事は出来ますか? あるいは、Mapで同じ値のオブジェクトでも参照が異なれば異なるキーを作るようにする方法はありますか?

    • ベストアンサー
    • Java
  • 参照・値渡しについて

    下記プログラム(ソース1)を実行すると「1」という値が出力されます。しかし、2行目をprivate static int a;とすると「0」という値が出力されます。 オブジェクトは参照渡しで基本データ型は値渡しと思ったのですが、2行目の値をString型で行ったところ全く変更されていない値が出力されました。(ソース2) 一体どういうことでしょうか? 回答のほどよろしくお願い致します。 (ソース1) public class X{ private static int a[] = new int[1]; public static void main(String []args){ modify(a); System.out.println(a[0]); } public static void modify(int a[]){ a[0]++; } } (ソース2) public class X{ static String a = "a"; public static void main(String []args){ modify(a); System.out.println(a); } public static void modify(String a){ a = "b"; } }

    • ベストアンサー
    • Java
  • 参照渡しの参照渡し

    こんにちは。PHPでの質問をさせて頂きます。 PHPで以下のようなコードを書いた場合値が参照渡しで返って来ません。 解決法をご存知の方がいたら是非教えて下さい。お願いします。 function &hoge(&$data,$key){  $ret=$data[$key]; } //これもダメ function hoge(&$data,$key,&ret){  $ret=$data[$key]; }

    • 締切済み
    • PHP
  • javaの参照渡しの問題

    javaの参照渡しの問題 javaの初心者で問題集で勉強しているのですが、 以下の問題の参照渡しの違いがわかりません。 ------------------------------------------- ソース1 class Samplea{ public void method(){ int b[] = new int[2]; set(b); System.out.println(b[0]); } public void set(int[] b){ b[0] = 30; } } class Sample{ public static void main(String srgs[]){ Samplea x = new Samplea(); x.method(); } } 実行結果 30 ------------------------------------------- ソース2 public class Test{ public static void main(String args[]){ String s1= "Hello"; String s2= "Good-Bye"; change(s1,s2); System.out.println(s1); } static void change(String s1,String s2){ s1 += ",Tom"; s1 = s2; } } 実行結果 Hello ------------------------------------------- 配列とString型は両方とも参照型なので ソース1の実行結果が「30」ならば、 ソース2の実行結果は「Good-Bye」になると思いました。 どなたか教えていただけないでしょうか。 宜しくお願いいたします。

    • ベストアンサー
    • Java
  • コンストラクタで参照渡しをする理由

    すでに質問済みの内容でしたら申し訳ありません。 php4を使用していまして、 HTML_QuickFormとSmartyを最近使い始めました。 ネットや書籍のサンプルコードを見ながら使用しているのですが、 $renderer =& new HTML_QuickForm_Renderer_ArraySmarty($smarty); 上記のような場合や フォームのコンストラクタ呼び出しの場合に =&を使用している意味が理解できません。 ・=&はオブジェクトの参照渡しという認識で合っていますでしょうか? ・参照渡しであった場合、実態を渡すのでなく参照で渡すべき理由とは何でしょうか? ご教授願えれば幸いです。 よろしくお願い致します。

    • ベストアンサー
    • PHP