thisキーワード
クラスのメソッドやコンストラクタの中からフィールドにアクセスする場合、現在処理を実行している自分自身のオブジェクトを表すために this を使用でき、「this.フィールド名」のようにアクセスできます。これはフィールド名とメソッドやコンストラクタで引数に指定した変数名が同じ場合によく使用されます。ここではオブジェクト指向における this キーワードの使用方法について解説します。
目次
thisキーワードとは
作成したオブジェクトのフィールドにアクセスするにはドット(.)を使って「オブジェクト.フィールド名」のようにアクセスすることができました。(実際にはフィールドに直接アクセスできるようにするのは推奨されません)。
public class Sample {
public static void main(String[] args) {
Product p = new Product();
p.price = 100;
}
}
class Product {
public int price;
}
クラスの中でフィールドにアクセスする場合、現在処理を実行している自分自身のオブジェクトを表すものとして this を利用できます。 this を使うことで「this.フィールド名」のようにアクセスできます。
public class Sample {
public static void main(String[] args) {
Product p = new Product(100);
}
}
class Product {
private int price;
Product (int newprice) {
this.price = newprice;
}
}
フィールド名と同じ変数名がメソッドやコンストラクタ内で使用されている場合は、フィールドを指していることが分かるように this を付けて記述する必要があります。
class Product {
private int price;
Produt (int price) {
// フィールド名と、コンストラクタの引数に指定している変数名が同じ
this.price = price;
}
}
この場合 this.price はフィールドを表し、 price はコンストラクタの引数を表します。
フィールド名と同じ変数名がメソッドやコンストラクタ内で使用されておらず、名前が重複していない場合は this を省略することもできます。
class Product {
private int price;
Produt (int newprice) {
price = newprice;
}
}
省略できる場合でも、フィールドを指していることがはっきりとわかるように this を付けて記述しても構いません。
class Product {
private int price;
Produt (int newprice) {
this.price = newprice;
}
}
※ なおこの記事で解説している this と、コンストラクタの中で別のコンストラクタを呼び出す this() は用途が異なります。 this() については次の記事で解説します。
this は setter のメソッドやコンストラクタなど、フィールドに対して新しい値を設定するときによく使用されます。簡単なサンプルを作って試してみます。
テキストエディタで次のように記述したあと、 Sample.java という名前で保存します。
public class Sample {
public static void main(String[] args) {
Product p = new Product(100, "リンゴ");
p.dispInfo();
}
}
class Product {
private int price;
private String name;
public Product(int price, String name) {
// フィールド名と変数名が同じなのでフィールドには this を付けています
this.price = price;
this.name = name;
}
public void dispInfo() {
// フィールド名と同じ変数がメソッド内にないので this を省略しています
System.out.println("名前:" + name + ",値段:" + price);
}
}
コンパイルを行います。
javac -encoding UTF-8 Sample.java
その後で、次のように実行してください。
java Sample
引数のあるコンストラクタを使って、オブジェクトを作成すると同時にフィールドに初期値を設定しています。コンストラクタでは引数で使用している変数名とフィールド名が同じなので、フィールドの方は this を付けています。それに対してフィールドの情報を出力するメソッド内では、フィールド名と同じ変数はありませんので this を省略しています。
-- --
オブジェクト指向における this キーワードの使用方法について解説しました。
( Written by Tatsuo Ikura )
著者 / TATSUO IKURA
これから IT 関連の知識を学ばれる方を対象に、色々な言語でのプログラミング方法や関連する技術、開発環境構築などに関する解説サイトを運営しています。