コンストラクション関数this()と参照変数this


すべてのクラスでデフォルトのジェネレータが作成され、ジェネレータの最初の行でジェネレータ->を呼び出さなければなりません.そうしないと、コンパイラは自動的に追加されます.
この部分だけを考えると、間違いの確率が高い.
作成したコンストラクション関数は、親クラスと子クラスのすべてのデフォルトコンストラクション関数を作成するのではなく、パラメータ値を入力するためです.

  • コンストラクション関数クラスがコンストラクション関数の最初の行でコンパイラによってコンストラクション関数を呼び出された場合、すべてのクラスの最上位祖先Objectクラスのコンストラクション関数が呼び出されるため、エラーは発生しません.

  • 子クラスがコンパイラによって最初の行でコンストラクション関数が呼び出された場合、親クラスにコンストラクション関数の基本コンストラクション関数がパラメータ入力されていないため、エラーが発生します.
  • 解決:親クラスのデフォルトジェネレータを直接作成するか、サブクラスのジェネレータの最初の行でジェネレータを呼び出します.
    作成者とは?
  • インスタンスを生成するときに呼び出されるインスタンス(iv)初期化方法.
  • 作成者の条件
  • ジェネレータの名前はクラス名と同じでなければなりません.
  • ジェネレータには戻り値がありません.
  • すべてのクラスにジェネレータが必要です.コンストラクション関数を定義せずにインスタンスを作成する場合、コンパイラはデフォルトコンストラクション関数(default constructor)を提供します.
    ->コンパイラがデフォルトのコンストラクタを追加するのは、クラスに定義されたコンストラクタが1つもない場合だけです.パラメータ付き作成者
  • ジェネレータドメインのようにパラメータを宣言し、インスタンスの初期化操作のために呼び出し時に値を渡すことができます.
    ->インスタンスの作成後に初期化を必要としないように、複数のジェネレータを用意することが望ましい.
  • public class Hello {
    	public static void main(String[] args) {
    
    		Car c1 = new Car("white", "auto", 4);
    		
    		System.out.println(c1.color + ", " + c1.gearType + ", " + c1.door); // while, auto, 4
    	}
    }
    
    class Car {
    	String color;
    	String gearType;
    	int door;
    	
    	Car() {} // 기본 생성자
    	Car(String color, String gearType, int door) {
    		this.color = color;
    		this.gearType = gearType;
    		this.door = door;
    	}
    }
    コンストラクション関数から別のコンストラクション関数を呼び出す-this()
  • が同じクラスのメンバー間で相互に呼び出すことができるように、生成者間でも相互に呼び出すことができる.ただし、次の2つの条件を満たす必要があります.
  • クラス名ではなくthis()を
  • ジェネレータの名前として使用します.
  • のあるコンストラクション関数から別のコンストラクション関数を呼び出す場合は、最初の行からのみ呼び出す必要があります.
  • 誤り
    Car(String color) {
      door = 5; // 첫번째 줄
      Car(color, "auto", 4); // 에러1. 생성자의 두 번째 줄에서 다른 생성자 호출
                             // 에러2. this(color, "auto", 4);로 해야함
    }
    class Car {
    	String color;
    	String gearType;
    	int door;
    	
    	Car() { // 아무런 매개변수를 받지 못했을 때 호출되며 디폴트 값에 해당한다.
    		// Car(String color, String gearType, int door)을 호출
    		this("white", "auto", 4);
    	}
    	
    	Car(String color) { 
    		// Car(String color, String gearType, int door)을 호출
    		this(color, "auto", 5);
    	}
    	
    	Car(String color, String gearType, int door) {
    		this.color = color;
    		this.gearType = gearType;
    		this.door = door;
    		
    	}
    }
  • のようなクラス内の作成者は通常相互関係が深いため、このような相互変調を有機的に接続することによって、より良いコードを得ることができる.また、修正が必要な場合は、より少ないコードを変更すればよいので、メンテナンスが容易になります.
  • 参照変数thisとは?
  • インスタンス自体を指す参照変数、インスタンスのアドレスが格納される.
  • は、すべてのインスタンスメソッドに地域変数として存在する.
  • リファレンス
  • 「this」は、インスタンスメンバーのみが使用できます.静的メソッド(クラスメソッド)では、インスタンスメンバーが使用できないように、thisも使用できません.
    静的メソッドはインスタンスを作成する必要がなく呼び出すことができるため、静的メソッド呼び出し時にインスタンスが存在しない場合があります.
  • 例1-作成者パラメータに渡された値がインスタンス変数の名前と異なる場合.
    Car(String c, String g, int d) { // color는 iv, c는 lv
      color = c; // this.color이 생략된 형태이다.
      gearType = g;
      door = d;
    }
  • 変数colorとcは名前のみで区別されるため、「this」は省略される.
  • 例2-作成者に渡されたパラメータの値がインスタンス変数の名前と同じである場合.
    Car(String color, String gearType, int door) { // this.color는 iv, color는 lv
      this.color = color;
      this.gearType = gearType;
      this.door = door;
    }
    注意!thisとthis()はあまり差がなく、全然違います.これは「参照変数」で、this()は「ジェネレータ」です.