―Javaプログラミングの前提知識―
2003/2/27
ThisとSuperを使い分ける |
ワンポイントQuestion |
次のプログラムを実行したときの結果として正しいものはどれですか? (単一選択)
1: class This_Super{ |
|
配列の宣言方法 |
キーワード「this」と「super」は、それぞれ自オブジェクトの参照、親オブジェクトの参照を意味するキーワードです。例えば、以下のようなコードがあります。
class MyClass { |
MySubClass内のfunc()メソッドでthisとsuperを使用しています。thisは自分自身のオブジェクト参照ですので、
this.x = 20; |
は、MySubClassのメンバ変数xに20を代入します。また、superはスーパークラスのオブジェクト参照ですので、
super.func(); |
は、MyClassのfunc()メソッド呼び出しになります。
参照データ型変数の使用方法と同様に、thisやsuperの後に「.(ドット)」をつけて、自オブジェクトや親オブジェクトの変数やメソッドを利用することができます(下図)。
thisとsuper |
また、thisやsuperを使ってコンストラクタを呼び出すこともできます。
例) thisを使ったコンストラクタ呼び出し |
class MyClass { |
この例のthis();は、引数なしのコンストラクタMyClass()を呼び出しています。
例) superを使ったコンストラクタ呼び出し |
class MyClass { |
この例のsuper();は、MySubClassのスーパークラスであるMyClassのコンストラクタMyClass()を呼び出しています。
thisやsuperをコンストラクタ呼び出しに使用することができますが、文法的な規則として、thisやsuperのコンストラクタ呼び出しは、そのコンストラクタの先頭に記述する必要があります。記述が先頭にない場合は、コンパイルエラーとなります。
本設問のソースファイルには3つのクラスが定義されています。1行目からの「This_Super」クラスはスーパークラス、9行目からの「Sub_This_Super」クラスは「This_Super」のサブクラス、19行目からの「Create」クラスはmainメソッドをもち、実行時に「Sub_This_Super」クラスのオブジェクトをつくります。「This_Super」クラスと「Sub_This_Super」クラスは継承関係にあります。
そして、それぞれのクラスにint型の変数iが別の初期値で宣言されています。superは継承関係にあるクラスのスーパークラスの要素をさします。よって「Sub_This_Super」クラスでsuperを指定した場合、「This_Super」クラスの要素をさします。また、thisは自クラスの要素をさしますので、「Sub_This_Super」クラスでthisを指定した場合、「Sub_This_Super」クラスの要素を指します。
プログラムの実行経過を以下で説明します。
(1)Createクラスを実行するとmainメソッドが呼び出され、処理を開始します。処理はまずSub_This_Superクラスのオブジェクトを作成してprintメソッドを呼び出します。 |
よって、プログラムの実行により表示されるのは「121」となります。
POINT |
クラスのメンバ変数とそのクラスがもつメソッド内のローカル変数が同一変数名の場合(例えば本設問のSub_This_Superクラスの変数iです)、ローカル変数が優先されるので、メンバ変数側を操作したい場合は、明示的にthisを指定する必要があります。 |
KEYWORD |
■スーパークラス クラス定義でキーワード「extends」の後に指定されたクラスです。 ■コンストラクタ クラスがインスタンス化されるときに呼び出される特殊なメソッドです。 |
ワンポイントQuestionの解答 |
正解 C
Java2ラーニングブック
−310-035 編− 本記事は@ITハイブックスシリーズ「Java2ラーニングブック −310-035 編−」(技術評論社)から、一部の内容を編集し転載したものです。本書の詳細は「@ITハイブックス」サイトでご覧いただけます。 |
- 実運用の障害対応時間比較に見る、ログ管理基盤の効果 (2017/5/9)
ログ基盤の構築方法や利用方法、実際の案件で使ったときの事例などを紹介する連載。今回は、実案件を事例とし、ログ管理基盤の有用性を、障害対応時間比較も交えて紹介 - Chatwork、LINE、Netflixが進めるリアクティブシステムとは何か (2017/4/27)
「リアクティブ」に関連する幾つかの用語について解説し、リアクティブシステムを実現するためのライブラリを紹介します - Fluentd+Elasticsearch+Kibanaで作るログ基盤の概要と構築方法 (2017/4/6)
ログ基盤を実現するFluentd+Elasticsearch+Kibanaについて、構築方法や利用方法、実際の案件で使ったときの事例などを紹介する連載。初回は、ログ基盤の構築、利用方法について - プログラミングとビルド、Androidアプリ開発、Javaの基礎知識 (2017/4/3)
初心者が、Java言語を使ったAndroidのスマホアプリ開発を通じてプログラミングとは何かを学ぶ連載。初回は、プログラミングとビルド、Androidアプリ開発、Javaに関する基礎知識を解説する。
|
|