参照の問題1
以下のようなコードがあります(開始から終了までの部分)。
//開始
class Test{
public static void main( String argv[ ] ){
Card c1 = new Card();
Card c2 = new Card();
Card c3 = c1;
c1.deposit = 1000;
c2.deposit = 2000;
c3.deposit = 3000;
int sum = c1.deposit + c2.deposit + c3.deposit;
System.out.println( "sum == " + sum );
}
}
class Card{
int deposit;
}
//終了
このコードをコンパイルし実行したときの結果として正しいものを
選択肢から選んでください。
(コンパイル、実行の方法は正しく行われるものとします。)
a. sum == 3000 と出力される。
b. sum == 4000 と出力される。
c. sum == 5000 と出力される。
d. sum == 6000 と出力される。
e. sum == 7000 と出力される。
f. sum == 8000 と出力される。
g. コンパイルエラーとなる。
h. 実行時エラーとなる。
前の問題
解答・解説
次の問題
f. sum == 8000 と出力される。
参照の問題1(解説)
今回は参照についての問題です。
参照についてはSJC-P対策Java用語集でも説明しているので参考にして下さいね。
SJC-P対策Java用語集:参照
突然ですが、参照とは何でしょうか?
参照とは、「メモリ上に生成されたインスタンスの場所を指し示す値」である
といえます。
CやC++が分かる人ならポインタに相当するものであると説明すれば分かり
易いでしょう。
注意するべき点は、参照とインスタンスは別のものであるということです。
つまり、参照はインスタンスがメモリ上のどこにあるのかを指し示すのであって、
インスタンス自身ではないのです。
このことを踏まえて今回のコードを見てみましょう。
Card c1 = new Card();
Card c2 = new Card();
Card c3 = c1;
このコードで生成されるインスタンスは2つだけです。
インスタンスは
new コンストラクタ()
という文で生成されます。
今回の問題のコードでは、 new Card() という処理により Card クラスのインスタンスがメモリ上に生成されます。
インスタンスが生成されると new Card() はそのインスタンスがどこにあるのか
を指し示す「参照」を返します。
返された値を c1 及び c2 という変数に格納しているのです。
ちなみに
Card c3 = c1;
という処理では、インスタンスの生成は行われません。
この処理では c1 に格納された「参照」を c3 にコピーしているだけです。
つまり、インスタンスがコピーされているわけではなく、インスタンスがどこに
あるかを指し示す値がコピーされているのです。
そのため、c1 と c3 は同じインスタンスを指し示すことになります。
図で示すと以下のようなイメージになります。
ところで、同じインスタンスを指し示すということはどういうことでしょうか。
c1 と c3 が同じインスタンスを指し示しているということは、c1, c3 を通じ
て行った操作は同じインスタンスに作用するということです。
以上のことを踏まえた上で、改めて最初から処理の流れを見てみましょう。
まずは
Card c1 = new Card();
でインスタンスが生成されます。
そして、そのインスタンスへの参照が c1 に格納されています。
続いて、
Card c2 = new Card();
でも新しくインスタンスが生成されています。
このインスタンスへの参照は c2 に格納されています。
しかし、
Card c3 = c1;
ではインスタンスは生成されていません。
c1 に格納されていた参照が c3 にコピーされただけです。
その結果、 c1 と c3 は同じインスタンスを指し示すことになります。
このような状態で、インスタンスを操作するとどうなるのか、処理の流れを追ってみましょう。
c1.deposit = 1000;
c1.deposit に 1000 を代入
c2.deposit = 2000;
c2.deposit に 2000をに代入
c3.deposit = 3000;
c3.deposit に 3000 を代入
c1 と c3 を通じて行った操作が同じインスタンスへ作用している様子が分かったかと思います。
c1.deposit と c3.deposit は同じものなんですね。
そのため、
int sum = c1.deposit + c2.deposit + c3.deposit;
の値は以下のようになります。
int sum = 3000 + 2000 + 3000;
これからも分かるように、 sum は 8000 となります。
そのため、実行結果は
>javac Test.java
>java Test
sum == 8000
となり、解答は f となります。
関連ページ: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認定試験!」についての説明です。
サイトで掲載しているソースコードや問題や免責事項などについて説明しています。
初めての人は一度のぞいてみて下さい。
ちょっとひと息
仕事や試験勉強に疲れたら、ここでちょっと一息つきませんか。
一生懸命に打ち込むのも良いけど、たまには何も考えずにゆっくり休むのも良いものです。
たまにはのんびり脳みそをリフレッシュしましょう。
|