English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Java 基礎教程

Java 流程制御

Java 配列

Java 面向オブジェクト(I)

Java 面向オブジェクト(II)

Java 面向オブジェクト(III)

Java 異常処理

Java リスト(List)

Java キュー(キュー)

Java Mapコレクション

Java Setコレクション

Java 入出力(I/O)

Java Reader/Writer

Javaの他のトピック

Java thisキーワード

この記事では、Javaのthisキーワードについて、どのように、どこで使用されるかを例を通じて説明します。

thisキーワード

Javaでは、thisキーワードは、メソッドやコンストラクタ内の現在のオブジェクトを参照するために使用されます。例えば、

class Main {
    int instVar;
    Main(int instVar){
        this.instVar = instVar;
        System.out.println("this参照= "); + this);
    }
    public static void main(String[] args) {
        Main obj = new Main(8);
        System.out.println("オブジェクト参照= "); + obj);
    }
}

出力

this参照 = com.ThisAndThat.MyClass@74a14482
オブジェクト参照 = com.ThisAndThat.MyClass@74a14482

上の例では、Mainクラスのobjという名前のオブジェクトを作成しました。その後、クラスのオブジェクトobjとthisキーワードの参照を印刷しました。

ここでは、objとthisの参照が同じであることがわかります。これは、これは単に現在のオブジェクトの参照であることを意味します。

thisキーワードを使用します

様々な状況で、通常thisキーワードを使用します。

変数名の曖昧さを解決するためにthisメソッドを使用します

Javaでは、範囲(クラス範囲またはメソッド範囲)内で2つ以上の同じ名前の変数を宣言することは許可されていません。しかし、インスタンス変数と引数が同じ名前を持つことができます。例えば、

class MyClass {
    // インスタンス変数
    int age;
    // 引数
    MyClass(int age){
        age = age;
    }
}

上のプログラムでは、インスタンス変数と引数が同じ名前を持っています:age。ここでは、名前が不明確であるため、Javaコンパイラが困惑しています。

この場合、thisキーワードを使用します。例えば、

まず、thisキーワードを使用しない例を見てみましょう:

class Main {
    int age;
    Main(int age){
        age = age;
    }
    public static void main(String[] args) {
        Main obj = new Main(8);
        System.out.println("obj.age = ", + obj.age);
    }
}

出力

mc.age = 0

上の例では、値8コンストラクタに渡されました。しかし、私たちが得た0は出力です。これは、Javaコンパイラがインスタンス変数と引数の間の名前が不明確であるため混乱しているためです。

今、thisキーワードを使用して上記のコードを書き直してみましょう。

class Main {
    int age;
    Main(int age){
        this.age = age;
    }
    public static void main(String[] args) {
        Main obj = new Main(8);
        System.out.println("obj.age = ", + obj.age);
    }
}

出力

obj.age = 8

今や期待される出力が得られました。これは、構造関数が呼び出されたとき、構造関数内の内容が呼び出した構造関数のオブジェクトobjで置き換わるためです。したがって、age変数は以下のように割り当てられます8。

また、パラメータとインスタンス変数の名前が異なる場合、コンパイラは自動的にthisキーワードを付加します。例:

class Main {
    int age;
    Main(int i) {
        age = i;
    }
}

等価です:

class Main {
    int age;
    Main(int i) {
        this.age = i;
    }
}

thisとGettersとSetters

thisキーワードの別の一般的な使用法は、クラスのsetterとgetterメソッドの例として:

class Main {
   String name;
   // setterメソッド
   void setName(String name) {
       this.name = name;
   }
   // getterメソッド
   String getName(){
       return this.name;
   }
   public static void main( String[] args ) {
       Main obj = new Main();
       // setterとgetterメソッドを呼び出す
       obj.setName("Seagull");
       System.out.println("obj.name: ",+obj.getName());
   }
}

出力

obj.name: Seagull

ここでは、thisキーワードを使用しています:

  • setterメソッドで値を割り当て

  • getterメソッドで値にアクセス

構造関数オーバーロードでthisを使用

処理中構造関数オーバーロード時他の構造関数から構造関数を呼び出す必要がある場合、明示的に構造関数を呼び出すことはできません。その代わりに、thisキーワードを使用する必要があります。

ここでは、thisキーワードの別の形式を使用しています。つまりthis()です。例を挙げてみましょう

class Complex {
    private int a, b;
    //带两个参数的構造関数
    private Complex(int i, int j) {
        this.a = i;
        this.b = j;
    }
    //単一のパラメータを持つコンストラクタ
    private Complex(int i){
        //二つのパラメータでコンストラクタを呼び出します
        this(i, i); 
    }
    //パラメータなしのコンストラクタ
    private Complex(){
        //単一のパラメータでコンストラクタを呼び出します
        this(0);
    }
    @Override
    public String toString(){
        return this.a + " + " + this.b + "i";
    }
    public static void main( String[] args ) {
  
                //Complexクラスのオブジェクトを作成します
                //使用2パラメータでコンストラクタを呼び出します 
        Complex c1 = new Complex(2, 3); 
    
        //単一のパラメータでコンストラクタを呼び出します
        Complex c2 = new Complex(3);
        //パラメータなしでコンストラクタを呼び出します
        Complex c3 = new Complex();
        //オブジェクトを印刷します
        System.out.println(c1);
        System.out.println(c2);
        System.out.println(c3);
    }
}

出力

2 + 3i
3 + 3i
0 + 0i

上記の例では、thisキーワードを使用しています。

  • Complex(int i)コンストラクタからComplex(int i, int j)コンストラクタを呼び出します

  • Complex()コンストラクタからComplex(int i)コンストラクタを呼び出します

この行に注意してください。

System.out.println(c1);

ここでは、オブジェクトcを印刷する際に、1オブジェクトが文字列に変換される際、toString()が呼び出されます。このプロセスで、toString()メソッドをオーバーライドしていますので、そのメソッドから出力を得ます。

 this()の最大の利点の1つは、重複コードの数を減らすことです。しかし、this()を使用する際には特に注意を払う必要があります。

 これは、別のコンストラクタからコンストラクタを呼び出すことでコストが増加し、遅いプロセスになるためです。this()を使用するもう一つの大きな利点は、重複コードの数を減らすことです。

注意:別のコンストラクタからコンストラクタを呼び出すことを明示的なコンストラクタ呼び出しと呼びます。

thisとして引数を渡します

thisキーワードを使用して、現在のオブジェクトをメソッドに引数として渡すことができます。例えば、

class ThisExample {
    // 変数を宣言します
    int x;
    int y;
    ThisExample(int x, int y) {
          //コンストラクタ内の変数に値を設定します
        this.x = x;
        this.y = y;
        //add()を呼び出す前のxとyの値
        System.out.println("thisをaddTwo()メソッドに渡す前に:");
        System.out.println("x = ") + this.x + ", y = " + this.y);
        //add()メソッドを呼び出し、thisを引数として渡します
        add(this);
        //add()を呼び出した後のxとyの値
        System.out.println("thisをaddTwo()メソッドに渡した後:");
        System.out.println("x = ") + this.x + ", y = " + this.y);
    }
    void add(ThisExample o){
        o.x += 2;
        o.y += 2;
    }
}
class Main {
    public static void main( String[] args ) {
        ThisExample obj = new ThisExample(1, -2);
    }
}

出力

addTwo() メソッドに this を渡す前に:
x = 1, y = -2
addTwo() メソッドに this を渡した後:
x = 3, y = 0

上記の例では、ThisExample() コンストラクタ内で以下の行に注意してください:

add(this);

ここでは、this を引数として渡して add() メソッドを呼び出します。this キーワードはクラスのオブジェクト obj の参照を含んでいるため、add() メソッド内で x と y の値を変更することができます。