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

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

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

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

Q&A

解決済

3回答

4311閲覧

メソッドを呼び出した後の行方が分かりません。

k_mail

総合スコア90

Java

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

0グッド

0クリップ

投稿2016/02/18 07:21

編集2016/02/18 07:22

Java SE7 Silver の資格を目指し勉強中の学生です。
問題集を解いていて、わからないところがありました。
質問が分かりずらいとは思いますが、理解できた一部だけでも返信いただけたら嬉しいです。

分からない点は大きく分けて2点です。
⓵問1の5行目でメソッドを呼び出しているが、returnで返す値はどこに行くのか(破棄されるのか?)
もし、破棄されるのであれば、このようなメソッドが記述されているのはテスト問題だから
ややこしく書いており、実際には(仕事では)、メソッドを呼び出して終わるという処理を記述することはないのか

⓶問2の4行目でmodifyメソッドを呼び出しているが、
なぜ戻り値のないvoidのついたメソッドを呼び出す必要があるのか、わかりません。
また、8行目に処理が書かれているが、戻り値がないvoidメソッドなのになぜ、処理が書かれているのかがわかりません。

問1

1 public class Sample{
2 private String value;
3 public void setValue(String value){
4 this.value = value;
5 }
6 public String getValue(){
7 return this.value;
8 }
9 }
このプログラムを利用する以下のプログラムはどうなるか

1 public class Main{
2 public static void main(String[] args){
3 Sample s = new Sample();
4 String val = s.setValue("hello")
5 s.getValue();
6 System.out.println(val);
7 }
8 }

回答は「Mainクラスの4行目でコンパイルエラーとなる」です。


問2

1 public class Sample{
2 int num;
3 public Sample(int num){
4 this.num = num;
5 }
6 }

このクラスを利用する以下のプログラムを実行した結果は?

1 public class Main{
2 public static void main(String[] args){
3 Sample s = new Sample(10);
4 modify(s.num);
5 System.out.println(s.num);
6 }
7 private static void modify(int num){
8 num *= 2;
9 }
10}

答えは「10が表示される」です。

よろしくお願いします。

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

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

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

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

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

guest

回答3

0

  1. Sampleインスタンスのvalueへの参照を取得していますが、何処にも格納されないのでそのまま参照値は消滅します。

後半の質問は「メソッドの返り値を格納などしないで使う使い方があるのか」という意味と解釈しますが、十分あります。例えばListのremove(int)メソッドは削除した要素を返しますが、これを使わず単に要素を削除するだけのメソッドとして使えるわけです。

  1. 仮にintが参照渡しだとしたら、メソッドから戻ってきたときに値が変わっているはずですが、実際はどうですか?という問題です。

投稿2016/02/18 08:01

swordone

総合スコア20651

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

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

k_mail

2016/02/18 08:21

いつも返信ありがとうございます。 確かに、Listのremove(int)メソッドは単に要素を削除するだけで終わってしまいますね。 ありがとうございました。
guest

0

ベストアンサー

①に関しては、お考えの通りでいいと思いますよ。
わざと無意味なことを、意味のあるように思わせるためのテスト用の罠でしょう。

Java

1// これは何の意味もない。戻り値は破棄される。 2s.getValue(); 3 4// これは戻り値の変数で受けているので意味がある 5String val = s.getValue();

②は中々難しいです。
一般的に言われている、「値渡し」「参照渡し」の理解を求める問題なんだと思います。
この問題の、modify(s.num); 呼び出しは何の意味もありません。
しかし、以下の場合は結果が変わります。
答えは「20が表示される」です。
「値渡し」「参照渡し」で調べてみてください。

Java

1public class Main { 2 public static void main(String[] args) { 3 Sample s = new Sample(10); 4 modify(s); 5 System.out.println(s.num); // 20と表示される 6 } 7 8 private static void modify(Sample s) { 9 s.num *= 2; 10 } 11} 12 13class Sample { 14 int num; 15 16 public Sample(int num) { 17 this.num = num; 18 } 19}

投稿2016/02/18 07:51

root_jp

総合スコア4666

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

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

k_mail

2016/02/18 08:01

ご返信ありがとうございます。 「値渡し」「参照渡し」の理解を求める問題なのですね。 似たような問題があったので解いてみます。 ありがとうございました。 勝手ながら、フォローさせて頂きました。 よろしくお願いします。
guest

0

実践的なコードを書くとコード量が増えたり、複雑になったりします。
Javaの仕様を理解しているかを確認することが目的なので、問題のコード自体が実践的とは限りません。
1について
この問題はSample#setValueの戻り値はvoidなので、String型の参照変数には入れられない。これはコンパイル時にわかるのでコンパイルエラーになるが答えになります。
ちなみに5行目のSample#getValueの戻り値は参照変数に参照が入らないためアクセスできない、そのためガーベジコレクションによって解放されるか、そもそもコンパイル時に削除されそうですね。

2について
呼び出す必要は問題だからあるとしか言えないですね。
これはJavaの仕様を理解しているかの問題です。値渡しと参照渡しの違いを理解しているかを確認したいのでしょう。

投稿2016/02/18 07:46

編集2016/02/18 07:50
yona

総合スコア18155

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

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

k_mail

2016/02/18 08:02

ご返信ありがとうございます。 「値渡し」「参照渡し」の理解を求める問題なのですね。 どの回答者も、「値渡し」「参照渡し」の理解とあったので確信しました。 似たような問題があったので解いてみます。 ありがとうございました。 勝手ながら、フォローさせて頂きました。 よろしくお願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問