はじめに
インフラの分野でも、Iac化が進んで行くと考えています。そこで、ノウハウが体系だっているものが学び易いと考えて、Javaを学びはじめました。
今回は、Javaにおけるthis
キーワードについて学んだことをアウトプットします。
インスタンス変数へのアクセス
this
は、現在のオブジェクト(インスタンス)を指し示す参照です。
例えば、クラス内のインスタンス変数とメソッドの引数が同じ名前である場合、this
を使うことで区別できます。
public class Person {
String name; // インスタンス変数
// コンストラクタ
public Person(String name) {
this.name = name; // 引数とインスタンス変数を区別する
}
public void introduce() {
System.out.println("My name is " + this.name); // インスタンス変数にアクセス
}
}
この場合、コンストラクタの引数name
とインスタンス変数name
が同じ名前なので、this.name
を使ってインスタンス変数にアクセスしています。
public class Main {
public static void main(String[] args) {
Person person = new Person("Alice"); // "Alice" を引数として渡す
person.introduce(); // introduce メソッドを呼び出す
}
}
My name is Alice
コンストラクタから別のコンストラクタを呼び出す
Javaでは、1つのコンストラクタから別のコンストラクタを呼び出すことができます。これを「コンストラクタチェイニング」と呼びます。その際、this
を使って別のコンストラクタを呼ぶことができます。
public class Person {
String name;
int age;
// 引数なしのコンストラクタ
public Person() {
this("Unknown", 0); // 別のコンストラクタを呼び出す
}
// 引数ありのコンストラクタ
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public void introduce() {
System.out.println("My name is " + name + " and I am " + age + " years old.");
}
}
My name is Unknown and I am 0 years old.
引数なしのコンストラクタからthis("Unknown", 0)
で引数ありのコンストラクタを呼び出しています。
メソッド内での自己参
this
を使って、現在のインスタンスを他のメソッドに渡すことができます。たとえば、インスタンス自身を引数として別のメソッドに渡すときに使用します。
public class Person {
String name;
public Person(String name) {
this.name = name;
}
public void greet(Person otherPerson) {
System.out.println("Hello, " + otherPerson.name);
}
public void introduce() {
this.greet(this); // 自分自身を引数として渡す
System.out.println("My name is " + this.name);
}
}
introduce
メソッドが自分自身を引数としてgreet
メソッドに渡しています。
実行の流れ
例えば、次のように Person
のインスタンスを作成し、introduce()
メソッドを呼び出すと仮定します。
public class Main {
public static void main(String[] args) {
Person person = new Person("Alice"); // 名前が "Alice" の Person インスタンスを作成
person.introduce(); // introduce メソッドを呼び出す
}
}
Hello, Alice
My name is Alice
-
greet(this)
の呼び出しにより、this
(つまり、person
インスタンス)がgreet()
メソッドの引数otherPerson
に渡され、otherPerson.name
は"Alice"
となります。これにより、"Hello, Alice"
が出力されます。 - 次に、
introduce()
メソッド内でthis.name
(つまり"Alice"
)が表示されます。
静的メソッド 使用不可
this
はインスタンスを参照するため、静的メソッド内では使用できません。静的メソッドはクラス自体に属するため、インスタンスを指すことができません。
public class MyClass {
static void myMethod() {
// this; // エラー: 静的メソッド内でインスタンスへの参照は使用できない
}
}
静的メソッド内では、クラスのインスタンスを明示的に作成してからそのインスタンスを操作する必要があります。