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

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

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

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

Q&A

解決済

2回答

3166閲覧

メソッドの受け取りがあいまいです。

k_mail

総合スコア90

Java

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

1グッド

1クリップ

投稿2016/03/26 03:55

編集2016/03/26 03:57

Java SE7 Silver の資格を目指し勉強中です。
分からない点は
・ 6,7行目のメソッドの受け取りについてです

1 public class Main{
2 private int num;
3 public static void main(String[] args){
4 new Main().sample;
5 }
6 private void sample(){
7 increment(++num);
8 System.out.println(num);
9 }
10 private int increment(int num){
11 num += 1;
12 return num;
13 }
14 }

回答は「1が表示される」です。解説では「incrementメソッドではreturn文でこのnumの値を返しているが、呼び出し元では返された値を受け取っていない」とあります。

確かにsampleメソッドにはvoidがついているが、呼び出し元は7行目のincrementであり、これにはvoidがついていないので、戻り値を受け取るのでは?と思いました。

返信は遅くなりますが、よろしくお願いします。

yodel👍を押しています

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

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

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

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

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

guest

回答2

0

値渡しと参照渡し、int型のデフォルト+引っ掛けの問題ですかね。

increment関数に渡す7行目の時点では、初期int型はデフォルトの指定で0が設定されています。
以下の通り、7行目の++numが実行されると、numの値が1になります。

java

16 private void sample() { 27 increment(++num); // = 1 38 System.out.println(num); 48 }

10行目のこの時点で渡されたあらかじめ7行目で計算されたnumは値のコピーによるものなので、
1が入っています。
コピーされた値を使って計算をしています。 num += 1; で2になります。
この2を12行目のreturn 文で返却しています。

java

110 private int increment(int num){ // 1 211 num += 1; // = 2 312 return num; // 2 が戻る 413 }

但し注目すべきなのは、その値を受け取るべき7行目では実行だけして受け取っていません。
本来下記のように書くことでincrementのメソッドの実行結果を受け取れます。

java

1private void sample() { 2 int sum = increment(++num); 3 System.out.println(sum); // この時点で2が表示されます 4}

ですが、今回は受け取っていないので、incrementメソッドに渡す前の値1のまま、
8行目が実行され、最終結果は1となります。

投稿2016/03/26 04:33

編集2016/03/26 04:34
lib

総合スコア446

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

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

k_mail

2016/03/26 04:39

「値を受け取るべき7行目では実行だけして受け取っていません。」 ただ呼び出しただけだったのですね。 ありがとうございます。
guest

0

ベストアンサー

これ、実はメソッドの引数や戻り値の問題ではなく、変数のスコープの問題ですね。
メソッドの戻り値を受け取るには下記のようにsampleメソッドを書き換える必要があります。
きちんとメソッドの戻り値を代入してあげる必要があります。

Java

1private void sample(){ 2 // increment(++num) // メソッドの戻り値を受け取っていないのでnum=1になる。 3 4 // incrementメソッドの引数に渡すときにインクリメントして、 5 // incrementメソッド内でさらにインクリメントされた値を受け取るためnum=2になる。 6 num = increment(++num); 7 System.out.println(num); 8}

また、おそらく混乱されている理由はこちらではないかと思うのですが、
incrementメソッド内のローカル変数numと、Mainクラスのフィールドのprivate int num; は、名前は同じですが、全く別の変数です。
incrementメソッド内でMainクラス内のnumにアクセスするには下記のように、this.を付けてあげる必要があります。(変数の名前が同じため、どちらのnumにアクセスするかを明示する必要があります。)
変数名が同じため、混乱しやすいですが。

Java

1private int increment(int num){ 2 //num += 1; // incrementメソッドのローカル変数num 3 this.num += 1; // Mainクラスのフィールド変数num 4 return num; 5}

投稿2016/03/26 04:19

編集2016/03/26 04:25
Odacchi

総合スコア907

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

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

k_mail

2016/03/26 04:37

メソッドを呼び出しているだけだったのですね。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問