Rainbow Engine

IT技術を分かりやすく簡潔にまとめることによる学習の効率化、また日常の気付きを記録に残すことを目指します。

Java

Javaのthisとは?コンストラクタで引数を与えている場合・メソッド引数に使われる場合もご紹介

投稿日:2020年12月27日 更新日:

<目次>

(1) Javaのthisとは?コンストラクタに出現する場合やメソッド引数に使われる場合もご紹介
 (1-1) thisとは?
 (1-2) 用途1:自分自身を指定【重要】
 (1-3) 用途2:自クラスの別のコンストラクタを呼び出す
 (1-4) 用途3:他オブジェクトに自身の参照を渡す

(1) Javaのthisとは?コンストラクタに出現する場合やメソッド引数に使われる場合もご紹介

(1-1) thisとは?

「this」は自オブジェクト内のメンバ変数やメソッドを表現する記述で、主に次の3つの用途があります。

(用途1)自分自身を指定【重要】
最もよく使う用途です。現在のオブジェクト(自分自身)のメンバ変数やメソッドを指定し、「メンバ変数」と「メソッドの引数」が同一名称の際の区別に使います。
 
(用途2)自クラスの別のコンストラクタを呼び出す
コンストラクタで自クラスの別のコンストラクタを呼び出します。コンストラクタがオーバーロードされている際に記述を簡略化できます。
 
(用途3)他オブジェクトに自身の参照を渡す

別のオブジェクトに自分の参照を渡し、オブジェクト間の関連づけを行う事ができます。

目次にもどる

(1-2) 用途1:自分自身を指定【重要】

1つ目の用途として「メンバ変数名」と「ローカル変数名」が重複した際のスコープ解決に使います。恐らく一番馴染みがある用途ではないでしょうか。
 
次の例のように「メンバ変数」の接頭辞として「this」を付ける事で、その変数はクラスの「メンバ変数である」事を示します(メソッドのローカル変数と区別を付ける)。
 
(サンプルプログラム①)
public class IT0210_ThisKeyword1 {
        public static void main(String args[]) {
                //Person1クラスをインスタンス化
                Person1 p1 = new Person1();
                p1.setValue("Rainbow Planet",30);
                System.out.println("My name is "+p1.name+" and my age is "+p1.ag                                    e);
        }
}
class Person1 {

        String name;
        int age;

        //(用途1)メンバ変数と引数の区別
        void setValue(String name,int age) {
                this.name = name;
                this.age = age;
        }
}

(図121)実行結果
nameとageはメンバ変数と引数で名前が重複しているため、メンバ変数側にはthisを付ける。

目次にもどる

(1-3) 用途2:自クラスの別のコンストラクタを呼び出す

2つ目の用途として、自クラス内の別のコンストラクタを呼ぶ時に使います。

これはクラス内で複数のコンストラクタがある場合に(コンストラクタがオーバーロードされている)、あるコンストラクタから別のコンストラクタを呼ぶことができ、これは正式には「明示的なコンストラクタ呼び出し」といいます。

ルールとして、この記述は必ずコンストラクタの1行目に記載する必要があります。

(サンプルプログラム②)

public class IT0210_ThisKeyword2 {
        public static void main(String args[]) {
                //引数を6個全て与えて初期化
                Person2 p2 = new Person2("Rainbow","Planet","Men",30,173.5,60.3);
                System.out.println("### My name is "+p2.firstname+" "+p2.lastname);
                System.out.println("### I am "+p2.age+" years old.");
                System.out.println("### My height is "+p2.height+" cm and my weight is "+p2.weight+" kg.");
        }
}
class Person2 {
        String firstname;
        String lastname;
        String gender;
        int age;
        double height;
        double weight;

        //(用途2)自クラスの別のコンストラクターを呼び出す
        Person2(String fnm, String lnm) {
                firstname = fnm;
                lastname = lnm;
                System.out.println("引数2個のコンストラクタを通過");
        }
        Person2(String fnm, String lnm, String gen, int a, double he, double we){
                //自クラス内の引数が2つ(いずれもString型)を呼び出す
                this(fnm, lnm);
                //上記コンストラクタで初期化しきれなかった残りの変数を初期化
                gender = gen;
                age = a;
                height = he;
                weight = we;
                System.out.println("引数6個のコンストラクタを通過");
        }
}

(図131)
引数6個のコンストラクタの最初に、引数2個のコンストラクタを呼んでる。

目次にもどる

(1-4) 用途3:他オブジェクトに自身の参照を渡す

3つ目の用途は「this」による自身の参照を渡す使い方です。

具体的には別のクラスのコンストラクタに自分自身の参照情報を代入しています。受け取った側はこの情報をクラス内の変数に格納するなどして利用します。この記述により、オブジェクト間に関連性を持たせる事ができます。

(サンプルプログラム③)

public class IT0210_ThisKeyword3 {
        public static void main(String args[]) {
                //引数を6個全て与えて初期化
                Person3 p3 = new Person3("Rainbow","Planet","Men",30,173.5,60.3);
        }
}
class Person3 {
        String firstname;
        String lastname;
        String gender;
        int age;
        double height;
        double weight;

        //(用途2)自クラスの別のコンストラクターを呼び出す
        Person3(String fnm, String lnm) {
                firstname = fnm;
                lastname = lnm;
                System.out.println("引数2個のコンストラクタを通過");
        }
        Person3(String fnm, String lnm, String gen, int a, double he, double we){
                //自クラス内の引数が2つ(いずれもString型)を呼び出す
                this(fnm, lnm);
                //上記コンストラクタで初期化しきれなかった残りの変数を初期化
                gender = gen;
                age = a;
                height = he;
                weight = we;
                System.out.println("引数6個のコンストラクタを通過");
                AdditionalInfo adinfo = new AdditionalInfo(this, "Kanagawa");
        }
}
class AdditionalInfo {
        String prefecture = "";
        AdditionalInfo(Person3 p3, String pref){
                prefecture = pref;
                System.out.println(p3.firstname+" "+p3.lastname+"さんの都道府県("+pref+")の登録が完了しました");
        }
}

 

(図141)

目次にもどる

Adsense審査用広告コード


Adsense審査用広告コード


-Java

執筆者:


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

関連記事

JavaのSpring Bootで404(Not_Found)エラーが出た時の対処方法について

  <目次> (1) JavaのSpring Bootで404(Not_Found)エラーが出た時の対処方法について  (1-1) エラー概要  (1-2) 原因  (1-3) 対処法 (1 …

Javaのsynchronizedとは?ある場合とない場合のサンプルPGを比較付き

<目次> (1) Javaのsynchronizedとは?ある場合とない場合のサンプルPGを比較付き  (1-1) synchronizedの概要  (1-2) synchronizedの構文  (1 …

GitHubのWebAPIをコールしてユーザー情報を取得するサンプルプログラムの解説+エラー対応も2例紹介

(0)目次&概説 (1) 目的  (1-1) 記事の目的 (2) APIの概要  (2-1) APIとは?  (2-2) Web APIとは?  (2-3) Web APIの様々な呼び方   (2-3 …

EclipseでJavaプロジェクトを同一サーバ内で別名コピーする方法

(0)目次&概説 (1) プロジェクトの別名コピーの手順  (1-1) プロジェクトのコピー&ペースト  (1-2) コピーしたプロジェクトをTomcatへ登録  (1-3) Tomcatサーバの再起 …

no image

jarファイル実行で「java.lang.ClassNotFoundException: com.sun.prism.es2.X11GLFactory」が出る原因と対策

  <目次> (1) jarファイル実行で「java.lang.ClassNotFoundException: com.sun.prism.es2.X11GLFactory」が出る原因と対策 …

  • English (United States)
  • 日本語
Top