参照の問題3
【3問目・問題】
以下のようなコードがあります(開始から終了までの部分)。
//開始
class Test{
public static void main( String argv[ ] ){
Card c1 = new Card();
Card c2 = c1;
c1.deposit = 1000;
c2.deposit = 2000;
Bank.useCard( c1 );
Bank.useCard( c2 );
/* A */
}
}
class Card{ int deposit; }
class Bank{
public static void useCard( Card c ){ c.deposit -= 500; }
}
//終了
このコードを実行したとき、コード中のAの時点において
c1.deposit と c2.deposit の関係はどうなっていますか。
a. c1.deposit < c2.deposit
b. c1.deposit > c2.deposit
c. c1.deposit == c2.deposit
d. コンパイルエラーとなる。
e. 実行時エラーとなる。
f. いずれの選択肢にも該当しない。
前の問題
解答・解説
次の問題
c. c1.deposit == c2.deposit
参照の問題3(解説)
今回は参照についての問題です。
参照についてはSJC-P対策Java用語集でも説明しているので参考にして下さいね。
SJC-P対策Java用語集:参照
ところで、この問題文中のコードで Card のインスタンスはいくつ生成されているでしょうか。
これが正しく理解できていれば、最後までコードを見なくても正しい解答を選ぶこと
ができます。
まずは順を追ってコードを見てみましょう。
最初に
Card c1 = new Card();
の new Card( ) という処理によって、Card クラスのインスタンスが生成されています。
また、new Card( ) は処理結果として生成されたインスタンスへの参照を返すので、その参照が
参照変数である c1 に格納されています。
次に
Card c2 = c1;
という処理では、 c1 に格納されている値(=参照)を c2 にコピーしています。
ここで行われているのは参照のコピーだけであり、新しくインスタンスは生成されていません。
この状態を図示すると以下のようになります。
その後、 c1、 c2 を通じてフィールドを設定している様子を連続して見てみます。
c1.deposit = 1000;
c2.deposit = 2000;
c1、 c2 は同一のインスタンスを指し示しているため、c1 、 c2 を通じて行った操作が
同じインスタンスに作用している様子が分かると思います。
その後、メソッドの引数として c1、 c2 を渡していますが、ここでも参照のコピーが行われる
だけで、新たなインスタンスの生成は発生しません。
処理の様子を見てみます。
Bank.useCard( c1 );
↓
public static void useCard( Card c ){
c.deposit -= 500;
}
上記のコードにおいては、まず引数として渡された c1 が c にコピーされます。
続いて、 c を通じてフィールドの操作をしています。
Bank.useCard( c1 );
↓
public static void useCard( Card c ){
c.deposit -= 500;
}
そして useCard メソッドの処理を抜けると c は破棄されます。
次の
Bank.useCard( c2 );
↓
public static void useCard( Card c ){
c.deposit -= 500;
}
についても流れはまったく同様です。
最初に c2 が c にコピーされて、 c を通じて deposit の操作を行っています。
Bank.useCard( c2 );
↓
public static void useCard( Card c ){
c.deposit -= 500;
}
Bank.useCard( c2 );
↓
public static void useCard( Card c ){
c.deposit -= 500;
}
メソッドを抜けてしまえばローカル変数である c は破棄されます。
さて、これでコード中のAに達するわけですが、c1.deposit と c2.deposit の関係は
もうお分かりですね。
両方とも同じインスタンスを参照しているわけですから、フィールドの値も当然同じに
なります。
そのため、解答は c となります。
念のため、Aの部分でフィールドの内容を出力してみましょう。
//開始
class Test{
public static void main( String argv[ ] ){
Card c1 = new Card();
Card c2 = c1;
c1.deposit = 1000;
c2.deposit = 2000;
Bank.useCard( c1 );
Bank.useCard( c2 );
/* A */
System.out.println( "c1.deposit == " + c1.deposit );
System.out.println( "c2.deposit == " + c2.deposit );
}
}
class Card{ int deposit; }
class Bank{
public static void useCard( Card c ){ c.deposit -= 500; }
}
//終了
>javac Test.java
>java Test
d1.deposit == 1000
d2.deposit == 1000
当然のことながら、同じ値が出力されます。
関連ページ:SJC-P対策Java用語集・参照
前の問題
この問題
次の問題
|
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認定試験!」についての説明です。
サイトで掲載しているソースコードや問題や免責事項などについて説明しています。
初めての人は一度のぞいてみて下さい。
ちょっとひと息
仕事や試験勉強に疲れたら、ここでちょっと一息つきませんか。
一生懸命に打ち込むのも良いけど、たまには何も考えずにゆっくり休むのも良いものです。
たまにはのんびり脳みそをリフレッシュしましょう。
|