こんにちは、運営者のハックです。
今回はデイトラJava Silver対策編「第6章の対策」のうち、前編の学習記録を紹介します。
第6章 インスタンスとメソッド
第6章ではインスタンスとメソッドについて学習しますが、前編の今回は主に「クラスとインスタンス」「参照型変数」「ガベージコレクション」「staticなフィールドとメソッド」について解いていきます。
今回も引き続き解説の参考と例題の引用は【黒本】と呼ばれる「徹底攻略Java SE 11 Silver問題集」から行っていきます。
クラスとインスタンス
オブジェクト指向プログラミングでは、クラスを定義し、クラスからインスタンスを生成して、インスタンスが動作することでプログラミングを動作させます。
クラスとインスタンスの関係は、設計図とそれに基づいて作られた実物の関係に似ています。
クラスはオブジェクトの設計図のようなもので、その属性(フィールド)と振る舞い(メソッド)を定義しています。一方、インスタンスはそのクラスに基づいて作成された具体的なオブジェクトです。
例えば、「車」というクラスがあった場合、その属性として色やモデルを持ち、加速や停止といった振る舞いを定義できます。そして、実際の「トヨタ・カローラ」や「ホンダ・シビック」などがこの車クラスのインスタンスとして具体化されたものです。それぞれの車はクラスの定義に基づきつつも、個々に異なる特徴(たとえば色やオプション)を持つことができます。
何となくイメージが掴めたと思うので、実際の例題を解いてみましょう!
次のプログラムを確認してください。
1. public class Item { 2. private int num = 10; 3. public void setNum(int num){ 4. this.num = num; 5. } 6. public int getNum(){ 7. return this.num; 8. } 9. }
このクラス利用する以下のプログラムを、コンパイル、実行したときの結果として、正しいものを選びなさい。(1つ選択)
1. public class Main{ 2. public static void main(String[] args) { 3. Item a = new Item(); 4. Item b = new Item(); 5. b.setNum(20); 6. System.out.println(a.getNum()); 7. } 8. }
A. 0が表示される。
「徹底攻略 Java SE 11 Silver 問題集」より抜粋
B. 10が表示される。
C. 20が表示される。
D. コンパイルエラーが発生する。
E. 実行時に例外がスローされる。
えーっと、まずItemクラスで「Item a」と「Item b」にそれぞれ10が代入されるのにゃ。
次に、Mainクラスでbに20が代入されるから、「Item b」には20が代入されているのにゃ。
でも、コンパイルで呼び出しているのはaの値だから、10が表示されると思うのにゃ。
だから選択肢Bが正解だにゃ!
正解です!考え方もバッチリです!
参照型変数とnull
参照型についてはJavaコース初級 基礎編Day7&8「基本型、標準API、条件分岐」で紹介しました。
ところで、参照型の変数は、オブジェクトの参照を保持しているか、保持していないかしか表現できません。参照を保持していないことを表現するためのリテラルはnullです。
「変数が何も参照をしていない」と言われてもよく分からないのにゃ。
では、例題を解いて理解を深めましょう。
次のプログラムを実行し、「NULL」と表示したい。3行目の空欄に入るコードとして、正しいものを選びなさい。(1つ選択)
1. public class Main{ 2. public static void main(String[] args) { 3. 「 空欄 」 4. System.out.println(obj); 5. } 6. }
A. Object obj = null;
「徹底攻略 Java SE 11 Silver 問題集」より抜粋
B. Object obj = false;
C. Object obj = NULL;
D. Object obj = ” “;
E. 選択肢AとCのどちらも可能である。
F. 選択肢A~Eはすべて誤りである。
まず、Bのfalseはbooleanの基本型で宣言していないから誤りなのにゃ。Dは「 」みたいに出力されるだけだから誤りなのにゃ。残るはnullを代入しているAとCなんだけど…
あにゃ?設問で表示したいのはnullじゃなくて大文字の「NULL」なのにゃ!?ということはnullじゃなくてただの文字列なのかにゃ?
その通り、「NULL」は何も参照していないリテラルの「null」ではありません。なので「null」を表示するAは誤りです。Cも文字列を「””」で囲っていないため「NULL」と表示することはできません。Dの「” “」はねこ奈が言うように「 」の状態で出力されます。これを空文字といいます。
よって、A~Dは全て誤りのため選択肢Fが正解です。
このように、nullと空文字が異なる点に注意しましょう。
ガベージコレクション
ガベージコレクション (Garbage Collection) とは、プログラムが動作する中で不要になったメモリ領域を自動的に解放する仕組みのことです。この仕組みにより、メモリの無駄遣いを防ぎ、プログラムの実行を効率化することができます。
以前の記事「Java Silver試験とJavaという言語について」の記事の中でも少し説明していたのにゃ。
例えば、Javaプログラムで次のようなコードがあったとします。
public class Example {
public static void main(String[] args) {
String str1 = new String("Hello");
String str2 = new String("World");
str1 = null; // str1が指していたメモリ領域は不要になった
// str2はまだ "World" を指している
}
}
このコードでは、str1とstr2という2つの文字列オブジェクトが作成されます。しかし、str1がnullに設定された後、そのオブジェクトはもはや使用されなくなります。ガベージコレクタは、この不要になったオブジェクト(”Hello” を指していたメモリ領域)を検出し、自動的に解放します。結果として、そのメモリ領域は再利用可能となります。
ガベージコレクションの仕組みについて慣れため、例題を解いてみましょう。
次のプログラムを実行し、7行目が終了したときにガベージコレクションの対象となるインスタンスはどれか。正しい説明を選びなさい。(1つ選択)
1. public class Main{ 2. public static void main(String[] args) { 3. Object a = new Object(); 4. Object b = new Object(); 5. Object C = a; 6. a = null; 7. b = null; 8. //more code 9. } 10. }
A. 3行目で作成したインスタンスだけが、ガベージコレクションの対象となる。
「徹底攻略 Java SE 11 Silver 問題集」より抜粋
B. 4行目で作成したインスタンスだけが、ガベージコレクションの対象となる。
C. 3行目と4行目で作成したインスタンスが、ガベージコレクションの対象となる。
D. ガベージコレクションの対象となるインスタンスは存在しない。
ガベージコレクションがプログラムが使用しなくなったメモリを解放することだったにゃ。
aもbもnullに書き換えられたから、選択肢Cのようにどちらもガベージコレクションの対象になりそうだにゃ。
でも、5行目でObject Cはaを代入しているのにゃ。その場合aは使用されているってことなのかにゃ。ガベージコレクションの対象ってどのタイミングでなるのにゃ?
ガベージコレクションの対象化は、インスタンスの参照がなくなったタイミングです。
インスタンスの参照が外れるタイミングとしては、主に変数にnullを代入するときです。
aとbにnullが代入されていますが、5行目でa変数Cに参照をコピーしているため参照がなくなった訳ではりません。
よって、7行目終了時点でインスタンスの参照がなくなったのはbのみなので、選択肢Bが正解です。
staticなフィールドとメソッド
Javaでは、プログラムの実行中にクラスを読み込み(ロード)、その内容をstaticな部分とそれ以外に分離して異なるメモリ空間に配置します。
staticフィールドはクラスのロード時にJVMによって一度だけstatic領域に割り当てられ、プログラム全体で共有されるため、クラス名を通じてインスタンス生成前でもアクセス可能です。例えば、ExampleクラスのstaticFieldはExample.staticFieldとアクセスできます。
一方、new Example(20)のように生成されたインスタンスはヒープ領域に配置され、各インスタンスごとに異なるinstanceFieldの値を持ちます。
静的フィールドはクラス全体で共通のデータを保持し、static領域に配置されますが、インスタンスフィールドはヒープ領域に配置され、各インスタンスで異なるデータを持ちます。
イメージを掴むため、例題を解いてみましょう。
次のプログラムを確認してください。
1. public class Sample { 2. static int num = 0; 3. }
このクラス利用する以下のプログラムを、コンパイル、実行したときの結果として、正しいものを選びなさい。(1つ選択)
1. public class Main{ 2. public static void main(String[] args) { 3. Sample.num = 10; 4. Sample s = new Sample(); 5. Sample s2 = new Sample(); 6. s.num += 10; 7. s2.num = 30; 8. System.out.println(Sample.num); 9. } 10. }
A. 10が表示される。
「徹底攻略 Java SE 11 Silver 問題集」より抜粋
B. 20が表示される。
C. 30が表示される。
D. Mainクラスの3行目でコンパイルエラーが発生する。
E. 実行時に例外がスローされる。
まず、Sample.num = 10;でnumは10に置き換わるのにゃ。
次にsとs2のインスタンスが生成されたのにゃ。
次の行ではs.num += 10;はnumに10が入っているから、「s.num = 20;」になるのにゃ。
でも、次の行でs2.num = 30;って記述があるからnumは30に置き換わるのにゃ。
だから、Sample.numを実行すると30が出力されるから、正解は選択肢Cだにゃ!
バッチリです!
staticなフィールドは、「クラス名.フィールド名」、インスタンスの作成後であれば、「参照.フィールド名」のどちらでもアクセスできます。
中編と後編に続きます
今回は「インスタンスとメソッド」について、「クラスとインスタンス」「参照型変数」「ガベージコレクション」「staticなフィールドとメソッド」について解きました。
第6章は問題数が多く、3分割で紹介することにしました。
ところで、解説を見る前に問題を解いたのですが、今回はほぼ正解することができました。
デイトラJavaコースで学習してきたことが、身になっていることを実感します。
以上で今回の学習記録を終えます。
ここまでご覧いただきありがとうございました。
コメント