具体的に一つクラスを作って説明しましょう。
java
1public class A {
2 int a;
3 public A(int a) {
4 this.a = a;
5 }
6
7 public boolean equals(Object anObj) {
8 //本当は型チェックなどが入るが省略
9 A anA = (A)anObj;
10 return this.a == anA.a;
11 }
12}
こんな感じのクラスを作り、
java
1/* 1 */ A a1 = new A(1);
2/* 2 */ A a2 = new A(2); //2
3/* 3 */ boolean b = a1.equals(a2);
こういうコードを実行することを考えます。
1行目および2行目ではAのコンストラクタを起動しています。コンストラクタはその型のインスタンスを作成する手続きを定めています。つまりこれが実行されている間はまだこのインスタンスは完成していません。
このAクラスのコンストラクタは、フィールド変数として持っているaに、渡されたint型整数を代入します。しかし、引数として使っている変数の名前もaで、そのまま使ってしまっては2つのaが区別できません(※)。これを区別するためにthisキーワードを使っているのです。
※フィールド変数とメソッド内のローカル変数で同じ名前を使用すること自体は問題ない。なお「区別できない」と書いたが、実際はthisを使わなかった場合、ローカル変数を指す。
3行目では、1行目および2行目で生成したAのインスタンスを使ってメソッドを起動しています。a1というインスタンスが持っているequalsというメソッドを使っています。a1のインスタンスが持っている情報を元にしてこのメソッドを処理します。この時、a1のインスタンスがここで言うところの「参照先のオブジェクト」に該当します。メソッド内でフィールド変数やメソッドをオブジェクトの指定無しで使った場合、「参照先のオブジェクト」が持つフィールド変数およびメソッドを指します。なので明示的にthisを使う必要はないのですが、今回のようにAクラスのオブジェクトが複数あって、明示的に区別できるようにしたいなどの理由でthisを使うことがあります。あるいは他のメソッドに自分自身のインスタンスを渡したい時にも使われます。ここでは使っていませんが、Aクラスのオブジェクトを要求するようなメソッドを、Aクラスのメソッドから起動するような場合に使います。
最後に、明確にどこからどこまでが生成中のオブジェクトで、どこからどこまでが生成されたオブジェクトなのでしょうか。
コンストラクタの中だけが生成中のオブジェクトで、それ以外は生成されたオブジェクトです。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/09/16 08:12