static の問題3
以下のようなコードがあります。(開始から終了までの部分)
//開始
class Test{
public static void main( String args[ ] ){
Player p1 = new Player();
Player p2 = new Player();
Player.id = 1000;
Player.id = 2000;
Player.num += p1.id;
Player.num += p2.id;
System.out.println( "Player.num == " + Player.num );
}
}
class Player{
int id = 0;
static int num = 0;
}
//終了
このコードをコンパイルし実行したときの実行結果を選択肢より
選んでください。
(コンパイル、実行の方法は正しく行われるものとします。)
a. Player.num == 0 と出力される。
b. Player.num == 1000 と出力される。
c. Player.num == 2000 と出力される。
d. Player.num == 3000 と出力される。
e. コンパイルエラーとなる。
f. 実行時に例外がスローされる。
前の問題
解答・解説
次の問題
e. コンパイルエラーとなる。
static の問題3(解説)
今回は static についての問題です。
static についてはSJC-P対策Java用語集でも説明しているので参考にして下さいね。
SJC-P対策Java用語集:static
static をつけて宣言されたフィールドはクラスフィールドとなります。
この問題の Player クラスの場合 num がクラスフィールドに該当します。
クラスフィールドは、クラスが一つだけ保持します。
逆に static をつけずに宣言されたフィールドはインスタンスフィールドとなります。
この問題の Player クラスの場合 id がインスタンスフィールドに該当します。
インスタンスフィールドは、生成されたインスタンスが個々に保持します。
さて、今回の問題のコードはコンパイルエラーとなってしまいます。
なぜエラーとなるのか、とりあえず実際にコンパイルしてみましょう。
>javac Test.java
Test.java:7: static でない 変数 id を static コンテキストから参照することは
できません。
Player.id = 1000;
^
Test.java:8: static でない 変数 id を static コンテキストから参照することは
できません。
Player.id = 2000;
^
エラー 2 個
わかりにくいエラーですが、簡単に言ってしまえば
「インスタンスフィールドにはクラスからアクセスすることはできません」
ということです。
1問目
と
2問目
では、インスタンスからクラスフィールドにアクセスしていました。
このようなアクセス方法ができるのは、
インスタンスは自分が所属するクラスを必ず一つに特定することができるからです。
では、逆にクラスからインスタンスフィールドにアクセスする場合を考えてみましょう。
クラス名からインスタンスフィールドにアクセスする場合、どのインスタンスにアクセスすれば良いでしょうか?
今回の問題の場合、 Player クラスから p1 、 p2 という2つのインスタンスを生成しています。
この場合、 Player.id という形でインスタンスフィールドにアクセスすると、 p1 と p2 のどちらの
id にアクセスすれば良いのか判別できません。
つまり、
Player.id = 1000;
という記述方法では、 p1.id にアクセスするべきか、 p2.id にアクセスするべきか判断できないのです。
これは
Player.id = 2000;
でも同様です。
そのため、コンパイル時のエラーも2個となっています。
このように、インスタンスは複数生成されている可能性がありますし、逆に1個も生成されていない可能性
もあります。
そうなるとクラスからインスタンスフィールドにアクセスしようとした場合、
コンパイラはどのインスタンスのフィールドにアクセスすれば良いのか判別できません。
このような事態を避けるために、あらかじめこのようなアクセス方法は禁止されています。
このためクラス名からインスタンスフィールドへアクセスするとコンパイルエラーとなるのです。
このような理由から、 Player.id といったクラスからインスタンスフィールドにアクセスする方法では
コンパイルエラーとなってしまい、解答は e となります。
※注意事項※
ここで使用されている図は、説明を分かりやすくする為に示したものですが、実際メモリ上の
イメージなどを表現しているわけではありません。
あくまでクラスとインスタンスの関係を説明するために、便宜的に利用しているものであることをご理解下さい。
関連ページ:SJC-P対策Java用語集・static
前の問題
この問題
次の問題
|
SJC-P対策問題集
Java認定試験( SJC-P/310-035 )対策のメルマガ問題集も好評発刊中!
もちろん無料です。
またバックナンバーも見やすくしてオンライン問題集として随時アップしていきます。
受験しない人でも Java の基礎知識を学習するのに最適です。
SJC-P対策参考書
現在、Java認定試験(SJC-P/310-035)対策の参考書は本当にたくさん出版されてます。
ここでは、その中から厳選した本当に役立つ参考書を紹介します。
無駄な出費を抑えるためにも、ぜひ参考にして下さい。
SJC-P対策Java用語集
Java認定試験( SJC-P/310-035 )合格のために必要な Java の用語を集めました。
試験対策にはもちろん、試験以外で Java を学習する際にもご活用下さい。
更新履歴
このサイトの最新情報はここで確認できます。
また、今までこのサイトがどのような軌跡を辿ってきたのかも知ることができます。
Javaを始める人へ
これからJavaを始めようとしているあなたへ。
Javaの勉強を始めるにはどうしたら良いのかを説明しています。
また、初心者に役立つ情報を提供していきます。
Java認定資格の概要
Java認定資格にはどのようなものがあるのか。
資格取得のためにはどのような知識が必要なのか。
その他、資格を取得することのメリットなど、Java認定資格の概要を説明します。
LINK
Javaの勉強に役立つリンク。
その他のプログラミングに関するリンク。
ソフトウェアに関するリンクなど、管理人の主観で集めたリンク集です。
相互リンクも常時募集中!
詳細は以下のページで確認して下さい。
このサイトについて
このサイト「1発合格★Java認定試験!」についての説明です。
サイトで掲載しているソースコードや問題や免責事項などについて説明しています。
初めての人は一度のぞいてみて下さい。
ちょっとひと息
仕事や試験勉強に疲れたら、ここでちょっと一息つきませんか。
一生懸命に打ち込むのも良いけど、たまには何も考えずにゆっくり休むのも良いものです。
たまにはのんびり脳みそをリフレッシュしましょう。
|