static の問題5
以下のようなコードがあります。(開始から終了までの部分)
//開始
class Test{
public static void main( String args[ ] ){
StaticTest st1 = new StaticTest();
StaticTest st2 = new StaticTest();
st1.method1();
st1.method2();
st2.method1();
st2.method2();
System.out.println( "st1.i == " + st1.i );
System.out.println( "st1.c == " + st1.c );
}
}
class StaticTest{
int i = 0;
static int c = 0;
public void method1( ){ i += 4; }
public static void method2( ){ c += 6; }
}
//終了
このコードをコンパイルし実行したとき、標準出力に出力される内容を
選択肢から選んでください。
(コンパイル、実行の方法は正しく行われるものとします。)
a.
st1.i == 4
st1.c == 6
b.
st1.i == 8
st1.c == 6
c.
st1.i == 4
st1.c == 12
d.
st1.i == 8
st1.c == 12
e.
a 〜 d のいずれの選択肢にも該当しない。
前の問題
解答・解説
次の問題
c.
st1.i == 4
st1.c == 12
static の問題5(解説)
今回は static についての問題です。
static についてはSJC-P対策Java用語集でも説明しているので参考にして下さい。
SJC-P対策Java用語集:static
また static について理解に自信がない人は
1問目・
2問目・
3問目・
4問目
までの基礎的な内容をまず復習してみて下さいね。
自分でも実際にコードを作成して色々試してみましょう。
さて、今回の問題についての解説です。
1問目〜4問目までは、クラスの外側からクラスやインスタンスを明示的に指定して
フィールドにアクセスしていました。
しかし、今回の問題の StaticTest のメソッド内では、特にクラスもインスタンスも明示せず
直接フィールドを指定しています。
( method1 では i に、 method2 では c に、クラス名もインスタンス名も指定せずにアクセスしています。)
このような場合、そのメソッドを呼び出したクラスまたはインスタンスのフィールドを参照することになります。
もう少し詳しく説明すると、以下のようになります。
クラスメソッド内で直接フィールドにアクセスする場合、実行中のメソッドを保持しているクラス
をたどってフィールドにアクセスします。
インスタンスメソッド内で直接フィールドにアクセスする場合、実行中のメソッドを保持しているインスタンスを
たどってフィールドにアクセスします。
この点をふまえて処理の流れを追ってみましょう。
まずインスタンスが一つも生成されていない状態は以下の通りです。
インスタンスが存在していないので、当然インスタンスフィールドもインスタンスメソッドも存在していません。
続いて
StaticTest st1 = new StaticTest();
StaticTest st2 = new StaticTest();
でインスタンスが生成されたあとの状態は以下の通りです。
ここまでは特に問題ありませんね。
次に
st1.method1();
で st1 のインスタンスメソッドを呼び出しています。
このようにメソッドを呼び出してメソッド内で処理を行っている場合、今後は以下のように表現します。
st1.method1();
↓
public void method1( ){ i += 4; }
さて、 method1 の中では、クラスもインスタンスも指定せずに i という識別子で直接フィールドを呼び出しています。
このような場合、実行中のメソッドを保持しているインスタンスを
たどってフィールドにアクセスします。
このコードでは、実行中の method1 を保持している st1 をたどって i にアクセスして処理することになります。
続いて
st1.method2();
↓
public static void method2( ){ c += 6; }
ではインスタンスからクラスメソッドを呼び出しています。
インスタンスからクラスメソッドの呼び出しに関しては
4問目
を参照して下さい。
この method2 の中でも、クラスもインスタンスも指定しないで直接フィールドにアクセスしています。
このようにクラスメソッド内で直接フィールドにアクセスする場合、実行中のメソッドを保持しているクラス
をたどってフィールドにアクセスすることになります。
このコードでは実行中の method2 を保持している StaticTest クラスをたどって c にアクセスすることになります。
今後もまったく同じ要領で考えることができます。
st2.method1();
↓
public void method1( ){ i += 4; }
クラス名、インスタンス名の指定なしに i にアクセスしているので、実行中の method1 を保持している
インスタンス st2 をたどって i にアクセスすることになります。
次の文も同様に考えましょう。
st2.method2();
↓
public static void method2( ){ c += 6; }
クラス名、インスタンス名の指定なしに c にアクセスしているので、実行中の method2 を保持している
クラス StaticTest をたどって c にアクセスすることになります。
そして最後に
System.out.println( "st1.i == " + st1.i );
System.out.println( "st1.c == " + st1.c );
で結果を表示しています。
上記のイメージ図からわかるように、 st1.i は 4 、 st1.c は 12 となります。
そのため、解答は c となります。
※注意事項※
ここで使用されている図は、説明を分かりやすくする為に示したものですが、実際メモリ上の
イメージなどを表現しているわけではありません。
あくまでクラスとインスタンスの関係を説明するために、便宜的に利用しているものであることをご理解下さい。
関連ページ: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認定試験!」についての説明です。
サイトで掲載しているソースコードや問題や免責事項などについて説明しています。
初めての人は一度のぞいてみて下さい。
ちょっとひと息
仕事や試験勉強に疲れたら、ここでちょっと一息つきませんか。
一生懸命に打ち込むのも良いけど、たまには何も考えずにゆっくり休むのも良いものです。
たまにはのんびり脳みそをリフレッシュしましょう。
|