参照
日本語 | 指し示すための番号 |
英語 | reference |
ふりがな | さんしょう |
フリガナ | サンショウ |
クラスのインスタンスを指し示す「番号」、もしくはその番号を格納するための変数。
クラスは、newを用いてインスタンスを作成しなければ使用できないが、そのインスタンスは直接操作することができない。
インスタンスは、作成時に「参照」と呼ばれる「番号」が振られ、返される。インスタンスを操作するためにはこの番号を用いてインスタンスを「参照」し、操作しなければならない。
その参照を受け取るのが「参照型」。この参照型は、プリミティブ型と同様に、クラスの変数を宣言すればそれが「クラスの参照型」となる。
この参照型変数にインスタンスの参照を格納することで、その参照型変数を用いてインスタンスにアクセスし、インスタンスを「クラス」として使用することができる。
と言っても、Javaではインスタンスを直接操作する方法がない以上、参照=クラスと考え、難しいことを考える必要はない。
ただし、参照が「ただの番号」だということは忘れてはならない。
特に、参照をコピーしても、その参照が指し示すインスタンスはコピーされないという点に注意すべき。
参照をコピーするということは、ひとつのインスタンスを複数の参照で操作できるということであり、危険度が増す点に注意。
特に、メソッドの引数として渡す場合や、クラスのフィールドとして参照を持っている場合に注意。後者は「シャローコピー」「ディープコピー」として知られる問題である。
参照の「番号」は、実際には「インスタンスのメモリ上でのアドレス値」である。
インスタンスは「メモリ上の確保した領域」の事であり、参照は「確保した領域の先頭アドレス」である。
C++言語で言うところの「アドレス」「ポインタ」に当たるものである。
参照の番号はObjectクラスのhashCode()メソッドを使用することで取得できる。
ただし、hashCode()メソッドは本来は「ハッシュコード」を取得するためのメソッドであり、クラスによってはオーバーライドされているため、すべてのクラスで取得できるわけではない。
そもそも、Javaでは「インスタンスの存在を覆い隠すために参照が用いられている」のであり、参照の値やアドレスについては気にしない方がよい。
クラスは、newを用いてインスタンスを作成しなければ使用できないが、そのインスタンスは直接操作することができない。
インスタンスは、作成時に「参照」と呼ばれる「番号」が振られ、返される。インスタンスを操作するためにはこの番号を用いてインスタンスを「参照」し、操作しなければならない。
その参照を受け取るのが「参照型」。この参照型は、プリミティブ型と同様に、クラスの変数を宣言すればそれが「クラスの参照型」となる。
この参照型変数にインスタンスの参照を格納することで、その参照型変数を用いてインスタンスにアクセスし、インスタンスを「クラス」として使用することができる。
と言っても、Javaではインスタンスを直接操作する方法がない以上、参照=クラスと考え、難しいことを考える必要はない。
ただし、参照が「ただの番号」だということは忘れてはならない。
特に、参照をコピーしても、その参照が指し示すインスタンスはコピーされないという点に注意すべき。
参照をコピーするということは、ひとつのインスタンスを複数の参照で操作できるということであり、危険度が増す点に注意。
特に、メソッドの引数として渡す場合や、クラスのフィールドとして参照を持っている場合に注意。後者は「シャローコピー」「ディープコピー」として知られる問題である。
参照の「番号」は、実際には「インスタンスのメモリ上でのアドレス値」である。
インスタンスは「メモリ上の確保した領域」の事であり、参照は「確保した領域の先頭アドレス」である。
C++言語で言うところの「アドレス」「ポインタ」に当たるものである。
参照の番号はObjectクラスのhashCode()メソッドを使用することで取得できる。
ただし、hashCode()メソッドは本来は「ハッシュコード」を取得するためのメソッドであり、クラスによってはオーバーライドされているため、すべてのクラスで取得できるわけではない。
そもそも、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は「メモリモデル」や「ポインタ」といった
// ものとは無関係な言語なので、参照としての値は気にしない方が
// いいでしょう。
}
}
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は「メモリモデル」や「ポインタ」といった // ものとは無関係な言語なので、参照としての値は気にしない方が // いいでしょう。 } }
「みだし」に含まれているページ
「解説」に含まれているページ
- %>
- )
- */
- +演算子
- --%>
- -演算子
- .
- /
- 0X
- 2の補数
- 2進数
- :演算子
- <%
- <% %>
- <%! %>
- <%--
- <%=
- <%= %>
- <%@
- <<演算子
- ==演算子
- >>>演算子
- >>演算子
- \
- ]
- ArrayList
- ArrayStoreException
- C++言語
- Calendar
- catch
- class
- classファイル
- clone
- close
- Comparable
- Connection
- const
- C言語
- Date
- do
- do-while
- double
- doステートメント
- DTD
- Enumeration
- equals
- exception
- final
- final変数
- float
- for
- forステートメント
- getter
- getter/setter
- Graphics
- HashMap
- HttpServletResponse
- instanceof
- JAVA_HOME
- javac
- JIS
- JSP暗黙オブジェクト「response」
- LinkedList
- matches
- native
- new
- Node
- null
- NullPointerException
- out
- PreparedStatement
- private
- protected
- public
- RequestDispatcher
- ResultSet
- ServletConfig
- ServletContext
- setter
- size
- Statement
- static
- superフィールド
- switchステートメント
- synchronized
- synchronizedブロック
- this
- throw
- toString
- Webアプリケーション
- while
- whileステートメント
- ZIP
- }
- 「e」
- 「f」
- 「l」
- アクセスコントロール
- アップキャスト
- アドレス
- アプリケーションサーバー
- アンダーフロー
- アンボクシング変換
- イベントリスナー
- インスタンス
- インスタンスは不変
- インターフェイス
- インターフェイス修飾子
- インポート
- エンティティコード
- オブジェクト型
- オブジェクト指向
- オートボクシング
- オーバーフロー
- オーバーライド
- ガベージコレクション
- キャスト
- クラス
- クラスパス
- クラス修飾子
- クロスサイトスクリプティング
- コネクション
- コンストラクタ
- コンストラクタ修飾子
- ジェネリッククラス
- ジェネリックメソッド
- スコープ
- ダウンキャスト
- ナローイング変換
- バイトストリーム
- バイト入力ストリーム
- バイト出力ストリーム
- フィールド
- フィールド修飾子
- フィールド宣言
- ブロック
- ブロックします
- ブロック修飾子
- プリミティブ型
- ボクシング変換
- ポリモーフィズム
- マジックナンバー
- メソッド
- メソッド修飾子
- ラッパー
- リテラル
- ローカル変数
- ローカル変数宣言
- ワイドニング変換
- 全角ハイフン
- 内部クラス
- 初期値
- 副作用
- 動的束縛
- 匿名クラス
- 半角
- 半角英数字
- 参照
- 呼び出し
- 型
- 変数
- 変数宣言
- 外部クラス
- 実体参照
- 宣言
- 寿命
- 引数
- 戻り値
- 投げる
- 排他
- 整数
- 整数リテラル
- 文字ストリーム
- 文字入力ストリーム
- 文字出力ストリーム
- 文字列リテラル
- 正規表現
- 浅いコピー
- 浮動小数点
- 深いコピー
- 添え字
- 無印
- 符号なし
- 符号付き
- 補数
- 識別子
- 配列
「サンプルプログラムとか」に含まれているページ
- +
- ++
- +=
- 0X
- <%@ taglib
- <<演算子
- ==演算子
- >>>演算子
- >>演算子
- @deprecated
- [
- Boolean
- close
- Connection
- CREATE TABLE
- DELETE
- Deprecated
- EOF
- EOFException
- equals
- execute
- FileInputStream
- FileOutputStream
- FileReader
- final変数
- Frame
- HashMap
- INSERT
- instanceof
- Iterable<T>
- JDBC
- JDBCドライバ
- Log4j
- Map
- new
- NOT NULL制約
- null
- PreparedStatement
- printStackTrace
- regex
- ResultSet
- RSS
- Rss4j
- SELECT
- Serializable
- SQLException
- SQLインジェクション
- StackOverflowError
- Statement
- static final
- staticコンテキスト
- staticフィールド
- super
- superフィールド
- synchronizedブロック
- this
- Throwable
- TLD
- tldファイル
- toString
- transient
- UPDATE
- WHERE
- 「e」
- 「l」
- アップキャスト
- インスタンス
- インスタンスは不変
- オブジェクト指向
- オートボクシング
- オーバーライド
- ガベージコレクション
- キャスト
- クエリー
- クラス
- コネクション
- コミット
- コンストラクタ
- コンソール
- コンパイル
- シャローコピー
- ジェネリッククラス
- ジェネリックメソッド
- スコープ
- タグライブラリ
- タグリブ
- テキストファイル
- テーブル
- トランザクション
- バイト入力ストリーム
- バイト出力ストリーム
- バイナリーファイル
- フィールド
- プリペアードステートメント
- プロパティファイル
- ポリモーフィズム
- ラッパー
- レコード
- ロック
- ローカル変数
- ロールバック
- 主キー
- 内部クラス
- 列
- 初期値
- 初期化
- 制約
- 動的
- 動的束縛
- 匿名クラス
- 参照
- 変数
- 実体参照
- 寿命
- 引数
- 戻り値
- 推奨されていません
- 文字入力ストリーム
- 正規表現
- 浅いコピー
- 深いコピー
- 添え字
- 直列化
- 行
- 配列
- 配列初期化子