質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

2回答

355閲覧

Javaでの戻り値voidのメソッドの使い方

kenty

総合スコア14

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2017/11/01 10:29

Javaを一年半勉強している者です.

同じクラス内に,
メソッドの中に(戻り値がvoidの)メソッドを使用したいのですが,結果がうまくいきません.

具体的には,

// xに1を足すメソッドa public static void a(double x){ x += 1.0; }

というメソッドaを利用して,

// xに1を足して返すメソッドb public static double b(double x){ a(x); return x; }

というメソッドbを作り,テストとしてmainメソッドで,

public static void main(String[] args) { double x = 1.0; System.out.println(b(x)); }

を実行します.予想では1+=12が出力されると思っていたのですが,
出力結果は1となってしまいました.

私が今直面している問題は直接この問題というわけではないのですが,本質的には同じことだと思われます.

何を勘違いしているのか教えていただき,改善点を教えていただければ幸いです.

よろしくお願いします.

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

Javaのローカル変数は概念的には次のようにスタック上にあると考えると何が起こっているか分かり易いかも知れません。(分かり易いかそうでないか微妙ですが・・・)

|...| | 2 |(A) <-bメソッドのローカル変数xの場所 |...| | 1 |(B) <-mainメソッドのローカル変数xの場所 |...|

bメソッドの中でxを変更しても(A)の場所の中身が変わるだけで、bを呼び出したmainメソッドのローカル変数(B)の中身はbメソッドの中では決して変更できません。参照型を使うと

java

1class ValueHolder { 2 int value; 3} 4 5static void b(ValueHolder x) { 6 x.value += 1; 7} 8 9public static void main(String[] args) { 10 ValueHolder x = new ValueHolder(); 11 x.value = 1; 12 b(x); 13 System.out.println(x.value); // 2が出力される 14}

となりますが、それはスタックとヒープが次のようになっているからです。

stack heap |...| ValueHolderのインスタンス |※ |(A) --*-->+---+ |...| | | 2 | |※ |(B) --+ +---+ |...| ※はValueHolderの参照を表す内部的な値(メモリーアドレス相当のもの)

投稿2017/11/01 10:57

編集2017/11/01 13:53
KSwordOfHaste

総合スコア18394

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kenty

2017/11/01 13:46 編集

自分のやり方だと、変数の見ている場所が違ったのですね。。。 解決方法がよくわかりました、ありがとうございました!
guest

0

プリミティブ型と参照型と違いは分かりますでしょうか。
今回の場合は、プリミティブ型ですのでaメソッド内では2になっていると思います。
また呼び出し元で宣言している変数xとaメソッド内の変数xは別々のメモリに保存されていると考えて下さい。(参照型であれば、同じメモリを参照していることになるので反映されます)

そのため、もし今回のようなケースを実施したいのであれば、Number型のような参照型を使用することで解決します。
オートボクシングの話は割愛します。

投稿2017/11/01 10:37

YasuhiroMiyake

総合スコア1336

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KSwordOfHaste

2017/11/01 10:58

intを単純にNumberに置き換えても同じことになると思います。Numberはimmutableなので・・・
YasuhiroMiyake

2017/11/01 11:18

おっと、失礼しました。 その通りです・・・。
swordone

2017/11/01 14:08

厳密に言うと、Numberがimmutableなのではなく、ラッパークラスのIntegerなどがimmutableです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問