- ベストアンサー
Javaの変数スコープについての疑問
- Javaの変数スコープに関して分かりにくい点があります。
- プログラムを実行すると最後の値が15ではなく20になる理由が分からないです。
- どなたか教えて頂けないでしょうか。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
> 参照先が変わらない限 > り、引数の値を変更し、main()に反映する事が出来ると > 考えてよろしいのでしょうか? 「引数の値」というのが意味不明です。 例えば質問文章中のプログラムの場合、second()メソッドは Valueクラスの変数を引数にとります。この引数の値とは、 とりも直さずその「参照」そのものに他なりません。 その値を変更するということは、参照先を変更することと 同義であるはずです。メソッドの中で参照先を変更しても、 それはメソッドの外には影響しません。呼び出し側の変数の 参照先は元のまま残ります。 メソッドの外に取り出せるのは、 「引数で参照されているインスタンスのメンバーの値」です。 これはいわばグローバル変数のようなもので、VMの中に おいてユニークな存在と考えて構いません。メソッドの 呼び出し側だろうと呼び出された側だろうと、その値は 同時にはただ一つです。 答えになったでしょうか。
その他の回答 (1)
- ranx
- ベストアンサー率24% (357/1463)
質問に対する直接の回答は、メソッドsecond()の中で20という値を代入しているからだと いうことになると思いますが、質問者の疑問は恐らくメソッドに値で渡された引数に代入 された値がなぜメソッドの外部に影響するのかということだと思います。 「参照型」に対する理解を深める必要があると思います。Javaにおける変数の型は、大きく 分けて二通りあります。「プリミティブ型」と「参照型」です。前者はintとかcharといった 基本的な型で、void、boolean、byte、char、short、int、long、float、doubleの9種類 しかありません。それ以外はすべて参照型と呼ばれるものになります。これは他の言語、 例えばCなどで「ポインタ」と呼ばれるものに相当すると考えて間違いありません。 つまり、変数とは別のところに実体があって、変数はそれを指し示す・参照するものとして 定義されます。変数だけでは実体が無いのです。では実体はどこで作られるかというと、 これを作るのが「new」という演算子です。newした時点で実体(インスタンス)が作成され、 それを「参照する」ものが変数に入れられるのです。これをメソッドの引数として使ったら どうなるか。実体を「参照するもの」がコピーされてメソッドに渡されます。しかし、 参照される実体(インスタンス)は元のままです。呼び出されたメソッドの中でメンバーの 値を変更すれば、それは直ちに元の変数から参照されている実体のメンバーの値の変更と なります。 しかし、vは同じくsecond()メソッドの中でvalを代入されているではないかと思われるかも しれません。ここで、Javaにおける引数が「値渡し」であることを思い出す必要があります。 呼び出されたメソッドの引数は、あくまで元の参照型変数の「コピー」なのです。参照先を 変更したからといって、元の変数の参照先が変わるわけではありません。ましてや、新しい 参照先のデータが元の参照先に影響を及ぼすものでもありません。 new演算子が使われた時点での実体を思い浮かべ、各変数がそれぞれ何を指し示しているかを 考えれば理解できると思います。
補足
早速の回答ありがとうございます。 Javaにおける引数が「値渡し」とは言えども、main()か ら呼ばれたメソッドにおいて、参照先が変わらない限 り、引数の値を変更し、main()に反映する事が出来ると 考えてよろしいのでしょうか?
お礼
再度の回答ありがとうございます。「引数の値」という のは、”メソッドに引数として渡された、参照型変数の 値”、という意味です。説明不足で申し訳ございません でした。ranxさんの説明を何回も注意深く読んでいるう ちに、理解出来たような気がします。ありがとうござい ました。