参照について:簡単に説明すると
参照とは、生成されたインスタンスのメモリ上の格納位置を示す値のことです。
インスタンスの操作は、必ずこの参照を介して行われます。
この参照はC言語のポインタに相当する概念です。
参照について:もっと詳しく
参照とインスタンスは別のものです。
インスタンスはフィールドやメソッドなどをまとめた構造体のようなものですが、
参照はそのインスタンスがどこにあるのかを指し示す値となります。
実際のコードで確認してみましょう。
class Test{
public static void main( String argv[ ] ){
Student st1 = new Student();
Student st2 = st1;
st1.id = 1;
st2.id = 2;
System.out.println( "st1.id == " + st1.id );
System.out.println( "st2.id == " + st2.id );
}
}
class Student{
int id;
}
インスタンスは
new コンストラクタ()
が実行されることで生成されます。
この式によってインスタンスが生成されると、このインスタンスのメモリ上の場所を示す参照が返されます。
例えば、
Student st1 = new Student();
の場合、Student クラスのインスタンスが生成された後に、そのインスタンスの参照が返されて
st1 に格納されます。
これを図で示すと以下のようになります。
他のページの説明では便宜上、以下のように図示しています。
でも実際には最初に示した図の方が参照のイメージに近いですね。
さて、なぜここで参照とインスタンスは異なるという点にこだわるのかについて説明します。
次の文を見てください。
Student st2 = st1;
この文は何をしているか分かるでしょうか。
Java を始めたばかりの人は勘違いしてしまうこともありますが、この文はインスタンスを
コピーしているのではありません。
この文は参照をコピーしているのです。
この状態を図示してみましょう。
st1 と st2 が同じインスタンスを指し示しているのがわかりますね。
インスタンスは1つしか生成していないのに対して、参照は2つ存在しています。
そして、その2つの参照が同じインスタンスをさしているのです。
なぜこのようになるのかというと、 st1 に格納されていた参照を st2 にコピーしたからです。
もしインスタンスをコピーしたのなら、インスタンスが2つになっているはずです。
しかしコピーされたのは参照だけであるため、インスタンスは1つのままになります。
その結果、 st1 と st2 は同じ参照を保持し、同じインスタンスを指し示すことになるのです。
ところで st1 と st2 が同じインスタンスを指し示しているということは、 st1 と st2 を通じて行った操作は
同じインスタンスに作用するということです。
つまり、
st1.id = 1;
と
st2.id = 2;
という文は同じインスタンスに作用しているのです。
さて、このことを踏まえて処理の流れを見てみましょう。
まずは
Student st1 = new Student();
で Student クラスのインスタンスが生成され、そのインスタンスへの参照が st1 に格納されます。
次の文には注意しましょう。
Student st2 = st1;
ここでは st1 から st2 へ参照のコピーが行われるだけで、新しいインスタンスは生成されません。
この後、異なる参照を通じて同じインスタンスを操作しています。
st1.id = 1;
st2.id = 2;
st1 と st2 を通じて行った操作が同じインスタンスに作用している様子が分かったかと思います。
さて、これで実行結果は分かりますよね。
st1 と st2 は同じインスタンスを指し示しているのだから、実行結果は以下のようになります。
>javac Test.java
>java Test
st1 == 2
st2 == 2
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認定試験!」についての説明です。
サイトで掲載しているソースコードや問題や免責事項などについて説明しています。
初めての人は一度のぞいてみて下さい。
ちょっとひと息
仕事や試験勉強に疲れたら、ここでちょっと一息つきませんか。
一生懸命に打ち込むのも良いけど、たまには何も考えずにゆっくり休むのも良いものです。
たまにはのんびり脳みそをリフレッシュしましょう。
|