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

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

ただいまの
回答率

90.51%

  • Java

    15838questions

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

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

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 749

k_mail

score 71

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が表示される」です。

よろしくお願いします。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+1

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

// これは何の意味もない。戻り値は破棄される。
s.getValue();

// これは戻り値の変数で受けているので意味がある
String val = s.getValue();

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

public class Main {
    public static void main(String[] args) {
        Sample s = new Sample(10);
        modify(s);
        System.out.println(s.num); // 20と表示される
    }

    private static void modify(Sample s) {
        s.num *= 2;
    }
}

class Sample {
    int num;

    public Sample(int num) {
        this.num = num;
    }
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/02/18 17:01

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

    キャンセル

+1

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/02/18 17:02

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

    キャンセル

+1

  1. Sampleインスタンスのvalueへの参照を取得していますが、何処にも格納されないのでそのまま参照値は消滅します。
    後半の質問は「メソッドの返り値を格納などしないで使う使い方があるのか」という意味と解釈しますが、十分あります。例えばListのremove(int)メソッドは削除した要素を返しますが、これを使わず単に要素を削除するだけのメソッドとして使えるわけです。

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/02/18 17:21

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

    キャンセル

同じタグがついた質問を見る

  • Java

    15838questions

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