第6章 インスタンスとメソッド - 『徹底攻略 Java SE 11 Silver 問題集』

この章で必要な知識は

□クラスとインスタンス
□参照型変数
□ガベージコレクション
□staticなフィールドとメソッド
□メソッドの呼び出しと定義
□メソッドのオーバーロード
□可変長引数
□return文
□コンストラクタ
□アクセス修飾子
□カプセル化とデータ隠蔽
□値渡しと参照渡し

です。早速、問題を見ていきましょう。


□⒈ 次のプログラムを確認してください。

public class Item {
  private int num = 10;
  public void setNum(int num) {
    this.num = num;
  }
  public int getNum(){
    return this.num;
  }
}

このItemクラスを利用する以下のプログラムを、コンパイル、実行したときの結果として、正しいものを選びなさい。(1つ選択)

public class Main {
  public static void main(String[] args) {
    Item a = new Item();
    Item b = new Item();
    b.setNum(20);
    System.out.println(a.getNum());
  }
}

A. 0が表示される
B. 10が表示される
C. 20が表示される
D. コンパイルエラーが発生する
E. 実行時に例外がスローされる





1. の解答

クラスインスタンスに関する問題です。
オブジェクト指向プログラミングでは、クラスを定義し、クラスからインスタンスを作成して、インスタンスが動作することでプログラムを動作させます。プログラムを記述したクラスそのものが動作するのではない点に注意しましょう。

クラスファイルは、ハードディスク上に保存されている単なるファイルに過ぎません。プログラムはハードディスク上では動作しないため、メモリ上に展開する必要があります。そのため、JVMは必要なクラスファイルをハードディスク上から探し出し、読み込んでメモリ上に展開(コピー)します。このコピーのことをインスタンスと呼びます。このようにコピーを取るため、インスタンスはクラスに定義した内容をそのまま持っているのです。

なお、厳密にはインスタンスはクラスの完全なコピーではありません。例えば、staticな変数などはインスタンスにはコピーされません。ただし、ここでは理解しやすくするために単純化して「コピー」と書いています。

もし、複数のインスタンスを作れば、複数のコピーを作ることになります。この仕組みのおかげで、インスタンスごとに異なる値を保持することができます。

設問のコードでは、Mainクラスの3行目と4行目でItemクラスのインスタンスをnewしています。そのため、メモリ上にはItemのコピーが2つできることになります。5行目では、2つ目のインスタンスのsetNumメソッドを呼び出しています。そのため、2つ目のインスタンスの値は20に置き換わります。一方、1つ目のインスタンスには何の変化もありません。1つ目のインスタンスの変数numは、インスタンス生成時に10で初期化されたままです。





□2. 次のプログラムを確認してください。

public class Item {
  public String name;
  public int price;
  public void printInfo() {
    System.out.println(name + "," + price);
  }
}

このクラスを利用する正しい以下のプログラムを、コンパイル、実行したときの結果として、正しいものを選びなさい。(1つ選択)

この記事が気に入ったらサポートをしてみませんか?