JavaA2Z

KAB-studio > プログラミング > JavaA2Z > 参照とは

参照

日本語 指し示すための番号
英語 reference
ふりがな さんしょう
フリガナ サンショウ

解説

クラスインスタンスを指し示す「番号」、もしくはその番号を格納するための変数
クラスは、newを用いてインスタンスを作成しなければ使用できないが、そのインスタンスは直接操作することができない。
インスタンスは、作成時に「参照」と呼ばれる「番号」が振られ、返される。インスタンスを操作するためにはこの番号を用いてインスタンスを「参照」し、操作しなければならない。
その参照を受け取るのが「参照」。この参照は、プリミティブ型と同様に、クラス変数宣言すればそれが「クラスの参照」となる。
この参照変数インスタンスの参照を格納することで、その参照変数を用いてインスタンスにアクセスし、インスタンスを「クラス」として使用することができる。
 
と言っても、Javaではインスタンスを直接操作する方法がない以上、参照=クラスと考え、難しいことを考える必要はない。
ただし、参照が「ただの番号」だということは忘れてはならない。
特に、参照をコピーしても、その参照が指し示すインスタンスはコピーされないという点に注意すべき。
参照をコピーするということは、ひとつのインスタンスを複数の参照で操作できるということであり、危険度が増す点に注意。
特に、メソッド引数として渡す場合や、クラスフィールドとして参照を持っている場合に注意。後者は「シャローコピー」「ディープコピー」として知られる問題である。
 
参照の「番号」は、実際には「インスタンスのメモリ上でのアドレス値」である。
インスタンスは「メモリ上の確保した領域」の事であり、参照は「確保した領域の先頭アドレス」である。
C++言語で言うところの「アドレス」「ポインタ」に当たるものである。
参照の番号はObjectクラスのhashCode()メソッドを使用することで取得できる。
 
ただし、hashCode()メソッドは本来は「ハッシュコード」を取得するためのメソッドであり、クラスによってはオーバーライドされているため、すべてのクラスで取得できるわけではない。
そもそも、Javaでは「インスタンスの存在を覆い隠すために参照が用いられている」のであり、参照の値やアドレスについては気にしない方がよい。

参考サイト


(KAB-studioからのおしらせです)

サンプルプログラム(とか)サンプルを別ウィンドウで表示サンプルをクリップボードへコピー(WindowsでIEの場合のみ)

// Sample.java
public class Sample
{
    public static void main( String[] args )
    {
        // StringBufferクラスの参照型変数を作ります。
        StringBuffer strbuf;
        // この中にはnullが入っています。
        // この段階では、StringBufferクラスの実体(インスタンス)は
        // 作られていないため、どうしようもないです。

        // StringBufferクラスの参照型変数に、
        // StringBufferクラスのインスタンスへの参照を格納します。
        strbuf = new StringBuffer();
        strbuf.append( "あいうえお" );
        System.out.println( strbuf );
        // あいうえお

        // 参照は、具体的に言えば、インスタンスに振られた
        // ただの番号なので、参照を他の参照型変数にコピーしても
        // インスタンスは増えません。ひとつのインスタンスを
        // 複数の参照型変数で参照することになります。
        StringBuffer strbuf2 = strbuf;
        strbuf2.append( "かきくけこ" );
        System.out.println( strbuf2 );
        // あいうえおかきくけこ
        System.out.println( strbuf );
        // あいうえおかきくけこ

        // このように、new StringBuffer()で作られたインスタンスは
        // 共用されるため、誤って他の変数を書き換えてしまう
        // 可能性があります。特にメソッドの引数として受け取った
        // 場合には注意してください。

        // 参照が格納する「インスタンスの番号」を取得するには
        // Object#hashCode()メソッドを使用します。
        System.out.println( new Object().hashCode() );
        // 10062600
        System.out.println( new Object().hashCode() );
        // 7785463
        System.out.println( new Object().hashCode() );
        // 21548172

        // ただし、Object#hashCode()メソッドがオーバーライドされてる
        // クラスでは取得できません。
        System.out.println( "0".hashCode() );
        // 48
        System.out.println( "1".hashCode() );
        // 49
        System.out.println( "2".hashCode() );
        // 50

        // そもそも、Javaは「メモリモデル」や「ポインタ」といった
        // ものとは無関係な言語なので、参照としての値は気にしない方が
        // いいでしょう。
    }
}
// Sample.java
public class Sample
{
    public static void main( String[] args )
    {
        // StringBufferクラスの参照型変数を作ります。
        StringBuffer strbuf;
        // この中にはnullが入っています。
        // この段階では、StringBufferクラスの実体(インスタンス)は
        // 作られていないため、どうしようもないです。

        // StringBufferクラスの参照型変数に、
        // StringBufferクラスのインスタンスへの参照を格納します。
        strbuf = new StringBuffer();
        strbuf.append( "あいうえお" );
        System.out.println( strbuf );
        // あいうえお

        // 参照は、具体的に言えば、インスタンスに振られた
        // ただの番号なので、参照を他の参照型変数にコピーしても
        // インスタンスは増えません。ひとつのインスタンスを
        // 複数の参照型変数で参照することになります。
        StringBuffer strbuf2 = strbuf;
        strbuf2.append( "かきくけこ" );
        System.out.println( strbuf2 );
        // あいうえおかきくけこ
        System.out.println( strbuf );
        // あいうえおかきくけこ

        // このように、new StringBuffer()で作られたインスタンスは
        // 共用されるため、誤って他の変数を書き換えてしまう
        // 可能性があります。特にメソッドの引数として受け取った
        // 場合には注意してください。

        // 参照が格納する「インスタンスの番号」を取得するには
        // Object#hashCode()メソッドを使用します。
        System.out.println( new Object().hashCode() );
        // 10062600
        System.out.println( new Object().hashCode() );
        // 7785463
        System.out.println( new Object().hashCode() );
        // 21548172

        // ただし、Object#hashCode()メソッドがオーバーライドされてる
        // クラスでは取得できません。
        System.out.println( "0".hashCode() );
        // 48
        System.out.println( "1".hashCode() );
        // 49
        System.out.println( "2".hashCode() );
        // 50

        // そもそも、Javaは「メモリモデル」や「ポインタ」といった
        // ものとは無関係な言語なので、参照としての値は気にしない方が
        // いいでしょう。
    }
}

この単語を含むページ

「みだし」に含まれているページ

「解説」に含まれているページ

「サンプルプログラムとか」に含まれているページ

はてなブックマーク 詳細を表示 はてなブックマーク ブックマーク数
livedoorクリップ 詳細を表示 livedoorクリップ ブックマーク数
Yahoo!ブックマーク 詳細を表示 users
del.icio.us 登録する RSSに登録
サンプルを別ウィンドウで表示
サンプルをクリップボードへコピー(WindowsでIEの場合のみ)
update:2005/10/22
このページは、Javaプログラミング言語についての用語を網羅した辞書「JavaA2Z」の一ページです。
詳しくは「JavaA2Z」表紙の説明をご覧ください。