Javaの言語としての特徴を継承・型・ポインタから確かめる
基本情報技術者試験 平成30年度秋期 午前 問8 / アルゴリズムとプログラミング › プログラム言語
過去問にチャレンジ
Javaの特徴はどれか。
- ア
オブジェクト指向言語であり,複数のスーパークラスを指定する多重継承が可能である。
- イ
整数や文字は常にクラスとして扱われる。
- ウ
ポインタ型があるので,メモリ上のアドレスを直接参照できる。
- エ
メモリ管理のためのガーベジコレクションの機能がある。
会話形式の解説
講師今回は、Javaの特徴として正しい記述を4つから1つ選ぶ問題です。継承の方式、整数や文字の扱い、ポインタの有無、メモリ管理の4つの観点が並んでいます。JavaはC++の影響を受けた言語なので、C++との違いを意識すると整理しやすくなります。
受験者Javaはオブジェクト指向言語だと覚えているので、オブジェクト指向と書いてある多重継承の記述が正しく見えてしまいます。
講師前半の「オブジェクト指向言語である」は正しい内容です。確かめたいのは後半で、Javaのクラスが継承できるスーパークラス、つまり親になるクラスはいくつまでだと思いますか。
受験者C++では複数の親クラスを指定できたはずですが、Javaは1つだけでしょうか。
講師そのとおりです。Javaのクラスの継承は単一継承で、複数のスーパークラスを指定する多重継承はできません。複数の型の性質をもたせたいときは、インタフェースを実装する方法をとります。前半が正しくても、後半が誤りなのでこの記述は外せます。
受験者ポインタ型でアドレスを直接参照できるという記述も、C言語の授業で習った内容に近いので、Javaには当てはまらない気がします。
講師よい着眼です。ポインタ型でアドレスを直接扱えるのはCやC++の特徴です。Javaの変数はオブジェクトへの参照を持つことはできますが、参照からアドレスの値を取り出したり、アドレスを計算したりすることはできません。多重継承とポインタは、C++にあってJavaが採り入れなかった機能だと押さえておくとよいです。
受験者整数や文字が常にクラスとして扱われるという記述は判断に迷いました。Integerというクラスがあったので、正しいのかと思ったのですが。
講師この記述はC++との違いではなく、「常に」という言い切りで判断します。intやcharは基本データ型、つまりプリミティブ型と呼ばれるもので、クラスではありません。IntegerやCharacterはラッパークラスといって、オブジェクトとして扱いたいときに必要に応じて使うものです。常にクラスというわけではないので誤りになります。
受験者残るのはガーベジコレクションの記述ですね。これはどういう仕組みでしょうか。
講師プログラムが実行中に確保したメモリのうち、どこからも参照されなくなった領域を、実行環境であるJVMが自動で解放する仕組みです。そのため、プログラマがメモリを解放する処理を自分で書く必要はありません。これがJavaの特徴に合っているので、この記述が正解です。
受験者整理すると、多重継承とポインタはC++との違いで外し、整数や文字の記述は「常に」が言い過ぎなので外し、メモリを自動で解放する仕組みが残る、という流れですね。
講師はい、その整理で十分です。「常に」「必ず」のように言い切った表現は、例外が一つでもあれば誤りになります。一部だけ正しい記述では、言い切りの部分が本当に成り立つかを確かめると判断しやすくなります。多重継承の記述のように前半だけ正しい形もよく出るので、文の最後まで読んで判断する習慣をつけておきましょう。
まとめ
Javaの特徴として正しいのは、不要になったメモリを実行環境(JVM)が自動で解放するガーベジコレクションの機能があるという記述です。Javaのクラスの継承は単一継承で、複数の型の性質をもたせたいときはインタフェースを使います。Javaにはポインタ型がなく、オブジェクトへの参照はあっても、アドレスを取り出したり計算したりはできません。intやcharはプリミティブ型でクラスではなく、オブジェクトとして扱いたいときだけラッパークラスを使います。「常に」のような言い切りや、前半だけ正しい記述に注意すると判断しやすくなります。
解答・解説
正解はエです
この問題のテーマ
Java の言語としての特徴を問う問題です。継承の方式、整数や文字の扱い、ポインタの有無、メモリ管理の仕組みについて、正しい組合せを見分けられるかが問われています。
解き方の考え方
各選択肢の記述を、Java の仕様に照らして一つずつ確かめます。Java は C++ の影響を受けた言語ですが、多重継承やポインタ操作のような扱いの難しい機能は採り入れていません。そのため、C++ にあって Java にない機能を述べた選択肢は外せます。残った選択肢が、Java が備えているメモリ管理の仕組みを述べているかを確認します。
選択肢ごとの解説
- ×ア オブジェクト指向言語であり,複数のスーパークラスを指定する多重継承が可能である。オブジェクト指向言語であるという前半は正しい内容です。しかし、Java のクラスが継承できるスーパークラスは1つだけで、複数を指定する多重継承はできません。複数の型の性質をもたせたいときは、インタフェースを実装する方法をとります。
- ×イ 整数や文字は常にクラスとして扱われる。整数や文字をクラスとして扱うという説明は、「常に」という点が誤りです。int や char は基本データ型(プリミティブ型)で、クラスではありません。Integer や Character などのラッパークラスを使えばオブジェクトとして扱えますが、それは必要なときだけです。
- ×ウ ポインタ型があるので,メモリ上のアドレスを直接参照できる。ポインタ型でアドレスを直接参照できるという説明は、C や C++ には当てはまりますが、Java には当てはまりません。Java の変数はオブジェクトへの参照を持つことはできます。しかし、参照からアドレスの値を取り出したり、アドレスを計算したりすることはできません。
- ○エ メモリ管理のためのガーベジコレクションの機能がある。ガーベジコレクションがあるという説明は Java の特徴に合っています。プログラムが実行中に確保したメモリのうち、どこからも参照されなくなった領域を、実行環境(JVM)が自動で解放します。そのため、プログラマがメモリを解放する処理を自分で書く必要はありません。
補足
「常に」「必ず」のように言い切った表現は、例外が一つでもあれば誤りになります。イのように一部だけ正しい記述では、言い切りの部分が正しいかを確かめると判断しやすくなります。
POINT
- Java のクラスの継承は単一継承で、多重継承に近い設計にはインタフェースを使います。
- int や char は基本データ型で、オブジェクトとして扱いたいときはラッパークラスを使います。
- Java にはポインタ型がなく、参照はあってもアドレスを直接操作することはできません。
- Java では、不要になったメモリをガーベジコレクションが自動で解放します。
