練習問題 解答

2.8 練習問題 解答

問1

① ×:フィールド変数のみ、メソッドのみ、フィールド変数+メソッドの3パターンがクラスには存在します。
② ○
③ ×:オブジェクトそのものではなく、オブジェクト参照情報を保持している。
④ ○
⑤ ×:明示的に区別がつくのでthisを付けるほうが好ましい。後同じ名前の変数であってもthisを付ける事でフィールド変数とその他の変数を区別することができる。

問2

  package jp.co.f1.basic.ch02exercise;

  public class Person01 {
    String name; // 名前
    int age; // 年齢

    // フィールド変数の値を画面にメッセージとして出力する
    public void showPerson() {
      System.out.println("この人の名前は" + this.name + "で、年齢は" + this.age + "歳です。");
    }
  }
  

フィールド変数に「String型変数name」と「int型変数age」、メソッドに戻り値・引数ともに無しの「showPersonメソッド」を定義しています。

問3

  package jp.co.f1.basic.ch02exercise;

  class Person02 {
    String name; // 名前
    int age; // 年齢

    // フィールド変数の値を画面にメッセージとして出力する
    public void showPerson() {
      System.out.println("この人の名前は" + this.name + "で、年齢は" + this.age + "歳です。");
    }
  }

  public class Practice0201 {
    public static void main(String[] args) {
      // Person02オブジェクトを2つ作成
      Person02 person1 = new Person02();
      Person02 person2 = new Person02();

      // 個々のオブジェクトに値を設定
      person1.name = "神田太郎";
      person1.age = 30;
      person2.name = "神田花子";
      person2.age = 20;

      // メソッドにアクセスし個々の結果を表示する
      person1.showPerson();
      person2.showPerson();
    }
  }
  

問4

  package jp.co.f1.basic.ch02exercise;

  public class Person03 {
    String name; // 名前
    int age; // 年齢

    // フィールド変数の値を画面にメッセージとして出力する
    public void showPerson() {
      System.out.println("この人の名前は" + this.name + "で、年齢は" + this.age + "歳です。");
    }

    // フィールド変数nameに引数の値を設定するメソッド
    public void setName(String name) {
      this.name = name;
    }

    // フィールド変数ageに引数の値を設定するメソッド
    public void setAge(int age) {
      this.age = age;
    }

    // フィールド変数nameの値を返すメソッド
    public String getName() {
      return this.name;
    }

    // フィールド変数ageの値を返すメソッド
    public int getAge() {
      return this.age;
    }
  }
  

問5

b. 実行時エラーになりエラーメッセージが表示される。

解説
オブジェクト変数personにはnew演算子オブジェクト参照情報が既に格納されています。初期値に「null」を設定しなくても途中でオブジェクト変数personに「null」を代入してしまうと、オブジェクト参照情報が分からなくなりメンバにアクセスできなくなります。よって実行時エラーとなってしまいます。

問6

「この人の名前は山田花子で、年齢は25歳です。」

解説

    public void showPerson(){
      String name = "山田花子";
      int age = 25;
      System.out.println("この人の名前は" + name + "で、年齢は" + age + "歳です。");
    }
    

ポイントはshowPersonメソッドのローカル変数がフィールド変数名と同じ所です。画面に結果を表示する際に「this」キーワードが付いていないため、フィールド変数よりもローカル変数の名前が優先されてしまいます。
結果フィールド変数の値「神田太郎」、「30」よりもローカル変数の値「山田花子」、「25」が表示されることになります。
ローカル変数フィールド変数と同じ名前がある場合で、フィールド変数を明示的に利用したいなら「this」キーワードを付ければ利用できることを覚えておいて下さい。

NEXT>> 3 アクセス修飾子とカプセル化