基本情報技術者 2018年 秋期 午前(科目A) 問08
問題文
Javaの特徴はどれか。
選択肢
ア:オブジェクト指向言語であり、複数のスーパクラスを指定する多重継承が可能である。
イ:整数や文字は常にクラスとして扱われる。
ウ:ポインタ型があるので、メモリ上のアドレスを直接参照できる。
エ:メモリ管理のためのガーベジコレクションの機能がある。(正解)
Javaの特徴はどれか。【午前2 解説】
要点まとめ
- 結論→Javaは自動ガーベジコレクションを備え、開発者が明示的にメモリ解放を行う必要はありません。
- 根拠→JavaはJVM上でヒープを管理し、不要になったオブジェクトをガーベジコレクタが検出して回収します。
- 差がつくポイント→多重継承はクラスでは不可でインタフェースで代替、ポインタはなく参照とプリミティブを区別します。
正解の理由
正解は エ です。
Javaは実行時にJVMがメモリ管理を行い、不要オブジェクトを自動で回収するガーベジコレクション(GC)機能を備えています。開発者は通常、malloc/freeのような明示的なメモリ解放を行わず、参照がなくなったオブジェクトはGCの対象となります。従って「メモリ管理のためのガーベジコレクションの機能がある」という記述が正しいです。
Javaは実行時にJVMがメモリ管理を行い、不要オブジェクトを自動で回収するガーベジコレクション(GC)機能を備えています。開発者は通常、malloc/freeのような明示的なメモリ解放を行わず、参照がなくなったオブジェクトはGCの対象となります。従って「メモリ管理のためのガーベジコレクションの機能がある」という記述が正しいです。
よくある誤解
- 「多重継承が可能」と考える誤解:Javaはクラスの多重継承をサポートしておらず、インタフェースで機能的に代替します。
- 「プリミティブも常にクラス扱い」とする誤解:intやcharなどのプリミティブ型はオブジェクトではなく、必要時に自動ボクシングでラッパークラスに変換されます。
- 「ポインタがある」と思う誤解:Javaに生のポインタはなく、参照を通じてオブジェクトにアクセスします。ポインタ演算はできません。
解法ステップ
- 設問の各選択肢のキーワード(多重継承、プリミティブ、ポインタ、ガーベジコレクション)を確認する。
- Javaの基本仕様(クラス継承ルール、プリミティブと参照の違い、メモリ管理方法)と照らし合わせる。
- 明らかに仕様と異なる選択肢を順に除外し、残った最も適合するものを選ぶ。
- 回答後、特に混同しやすい「参照とポインタ」「多重継承とインタフェース」を念のため振り返る。
選択肢別の誤答解説
- ア: オブジェクト指向言語であり、複数のスーパクラスを指定する多重継承が可能である。
→ 誤り。Javaはクラスの多重継承をサポートしていません。クラスは単一継承であり、多重継承的な設計はインタフェースで実現します。 - イ: 整数や文字は常にクラスとして扱われる。
→ 誤り。intやcharなどのプリミティブ型はクラスではなく基本型です。自動ボクシングでIntegerやCharacterに変換される場合がありますが、常にクラス扱いされるわけではありません。 - ウ: ポインタ型があるので、メモリ上のアドレスを直接参照できる。
→ 誤り。Javaは生のポインタ操作を許可していません。オブジェクトへの参照はあるものの、アドレス演算や直接操作はできず安全性が高められています。 - エ: メモリ管理のためのガーベジコレクションの機能がある。
→ 正しい。JavaはJVMが自動でガーベジコレクションを行い不要オブジェクトを回収します。→ エ
補足コラム
Javaのガーベジコレクションは世代別(Generational)方式やマーク&スイープなどのアルゴリズムを採用し、JVM実装やバージョンによってG1やZGCなど複数のコレクタが選べます。System.gc()はGCを促す呼び出しに過ぎず、即時実行や回収の保証はありません。また、finalize()は非推奨(deprecated)であり、代わりにtry-with-resourcesや明示的なクローズ処理を推奨します。
FAQ
Q1: Javaにポインタは全く存在しないのですか?
A1: 正確には「生のポインタ操作」は存在しません。参照はオブジェクトを指しますが、アドレス演算や直接メモリ操作は不可です。
A1: 正確には「生のポインタ操作」は存在しません。参照はオブジェクトを指しますが、アドレス演算や直接メモリ操作は不可です。
Q2: ガーベジコレクションはいつ実行されますか?
A2: 実行タイミングはJVMに依存し保証されません。メモリ状況やGCアルゴリズムにより動作します。
A2: 実行タイミングはJVMに依存し保証されません。メモリ状況やGCアルゴリズムにより動作します。
Q3: プリミティブ型をオブジェクトとして扱いたいときは?
A3: 自動ボクシングによりIntegerやCharacterなどのラッパークラスに変換できますが、性能やnull可否に注意が必要です。
A3: 自動ボクシングによりIntegerやCharacterなどのラッパークラスに変換できますが、性能やnull可否に注意が必要です。
Q4: 多重継承が必要な場合、Javaではどう実現しますか?
A4: インタフェースの実装で多重の振る舞いを組み合わせます。Java 8以降はデフォルトメソッドも使えますが、状態の多重継承は設計に注意が必要です。
A4: インタフェースの実装で多重の振る舞いを組み合わせます。Java 8以降はデフォルトメソッドも使えますが、状態の多重継承は設計に注意が必要です。
関連キーワード: Java、ガーベジコレクション、ガベージコレクタ、オブジェクト指向、参照、プリミティブ、多重継承、インタフェース、メモリ管理、JVM

\ せっかくなら /
基本情報技術者を
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

