2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Javaでのオブジェクト指向プログラミング

Posted at

はじめに

インフラの分野でも、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; // エラー: 静的メソッド内でインスタンスへの参照は使用できない
    }
}

静的メソッド内では、クラスのインスタンスを明示的に作成してからそのインスタンスを操作する必要があります。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?