*JAVA-作成者


作成者とは?


ジェネレータは、インスタンスの作成時に呼び出されるインスタンス初期化メソッドです.
したがって、主にインスタンス変数の初期化操作に使用され、インスタンスの作成時に実行すべき操作にも使用されます.
ジェネレータはメソッドと似ていますが、値は返されません.しかし,これは構造関数の前にvoidを使用することを意味するものではなく,ただ何も少なくない.
  • ジェネレータの名前は、クラスの名前と同じである必要があります.
  • ジェネレータには戻り値がありません.
  • ジェネレータはオーバーロードすることもできます.したがって、1つのクラスに複数のジェネレータが存在する可能性があります.
    클래스이름(타입변수명, 타입변수명,....)
    {
    	//인스턴스 생성 시 수행될 코드,
        //주로 인스턴스 변수의 초기화 코드를 적는다.
    }
    
    class Card()
    {
    	Card()
        {
        	//매개변수가 없는 생성자.
        }
        
        Card(String k, int num)
        {
        	//매개변수가 있는 생성자
        }
    }
    ジェネレータによってインスタンスを作成するのではなく、演算子newによってインスタンスを作成します.
    	Card c = new Card();
        
        1. 연산자 new에 의해서 메모리(heap)에 Card클래스의 인스턴스가 생성된다.
        2. 생성자 Card()가 호출되어 수행된다.
        3. 연산자 new의 결과로, 생성된 Card인스턴스의 주소가 반환되어 참조변수 c에 저장된다.

    デフォルトコンストラクション関数(default constructor)


    各クラスは、1つ以上のコンストラクション関数を定義する必要があります.
    これまでクラスでコンストラクション関数を定義する必要がなく、コンパイラが提供する「基本コンストラクション関数」(default constructor)のおかげでインスタンスを作成できました.
    	클래스이름(){}
        Card(){ }
    class Datal{
    	int value;
    }
    
    class Data2{
    	int value;
        
        Data2(int x){	//매개변수가 있는 생성자.
        	value = x;
        }
    }
    
    class ConstructorTest{
    	public static void main(String[] args)
        {
        	Data d1 = new Data1();
            Data2 d2 = new Date2();	//compile error 발생
        }
    }
    
    실행결과
    
    ConstructorTest.java:15: cannot resolve symbol
    symbol : constructor Data2()
    location  : class Data2
    					Data2 d2 = new Data2();	//compile 에러 발생
    このエラーは、Data 2に作成者Data 2()が定義されていないためです.
    Data 1には定義されたコンストラクタが1つもないため、コンパイラはデフォルトコンストラクタを追加しますが、Data 2にはコンストラクタData 2(int x)が定義されているため、デフォルトコンストラクタは追加されません.
    Data1 d1 = new Data1();
    Data2 d2 = new Data2();			//에러
    
    Data1 d1 = new Data1();
    Data2 d2 = new Data2(10);		// ok
    上記の例では、コンパイルエラーを回避するために、右側のコードのように、Data 2インスタンスの作成時にジェネレータData 2(int x)を使用するか、クラスData 2にジェネレータData 2()を追加定義します.
    コンパイラがデフォルトのコンストラクタを追加したのは、クラスに定義されたコンストラクタが1つもない場合だけです.

    パラメータ付き作成者

    class Car{
    	String color;		//색상
        String gearType;	//변속기 종류 - auto(자동), manual(수동)
        int door;			//문의 개수
        
        Car(){}				//생성자
        Car(String c, String g, int d)
        {
        	color = c;
            gearType = g;
            door = d;
        }
    }
    パラメータ付きジェネレータCar(String color,String Gear Type,int door)を使用すると、インスタンスを作成しながら必要な値に初期化できます.
    インスタンスを作成し、インスタンス変数の値を変更するよりも、パラメータ付きジェネレータを使用してコードを簡潔かつ直感的に作成します.
    Car c = new Car("white", "auto", 4);

    コンストラクション関数から別のコンストラクション関数を呼び出す-this(),this


    同じクラスのメンバー間で相互に呼び出すことができるように、生成者間でも相互に呼び出すことができます.しかし、以下の条件を満たす必要があります.
    クラス名ではなくthisを
  • ジェネレータの名前として使用します.
  • のあるコンストラクション関数から別のコンストラクション関数を呼び出す場合は、最初の行からのみ呼び出す必要があります.
  • Car(String c, String g, int d)
    {
    	color = c;
        gearType = g;
        door = d;
    }
    Car(String color, String gearType, int door)
    {
    	this.color = color;
        this.gearType = gearType;
        this.door = door;
    }

  • 次のコードのように、コンストラクション関数パラメータとして宣言された変数名がcolorの場合、インスタンス変数の前に「this」が使用されます.

  • 「this」は、インスタンス自体を指す参照変数です.

  • インスタンス変数にアクセスするには、「this」を使用します.たとえば、変数を参照してインスタンスのメンバーにアクセスできます.

  • ただし、「this」はインスタンスメンバーのみが使用できます.

  • 静的メソッド(クラスメソッド)では、インスタンスメンバーが使用できないように、thisも使用できません.
  • は、このインスタンス自体を指す参照変数、インスタンスのアドレスを格納する.すべてのインスタンスメソッドに領域変数として存在します.
  • this()、this(パラメータ)ジェネレータ.同じクラスの他のジェネレータを呼び出すために使用されます.
  • ジェネレータを使用したインスタンスのコピー


    ジェネレータは、現在使用されているインスタンスと同じ状態のインスタンスを作成する場合に使用できます.
  • の2つのインスタンスは同じ状態を有し、すなわち、2つのインスタンスのすべてのインスタンス変数は同じ値
  • を有する.
  • のクラスから作成されたすべてのインスタンスのメソッドとクラス変数は同じであるため、インスタンス間の相違は、各インスタンスが異なる値しか持たないインスタンス変数である.
  • 	Car(Car c)
        {
        	color = c.color;
            gearType = c.gearType;
            door = c.door;
        }
    上のコードは,Carクラスの参照変数をパラメータとして宣言するジェネレータである.パラメータに渡される参照変数が指すCarインスタンスのインスタンス変数color、gearType、doorの値をインスタンス自体にコピーします.
    class Car{
    	String color;		//색상
        String gearType;	//변속기종류 auto(자동), manual(수동)
        int door;
        
        Car(){
        	this.("white", "auto", 4);
        }
        
        Car(Car c){		//인스턴스의 복사를 위한 생성자
        	color 	 = c.color;
            gearType = c.gearType;
            door 	 = c.door;
        }
        
        Car(String color, String gearType, int door)
        {
        	this.color 	  = color;
            this.gearType = gearType;
            this.door	  = door;
        }
    }
    
    class CarTest3
    {
    	public static void main(String[] args)
        {
        	Car c1 = new Car();
            Car c2 = new Car(c1);	//c1의 복사본 c2를 생성
            
            System.out.println( "c1의 color =" c1.color +",
            gear Type="+ c1.gearType + ", door=" c1.door);
            System.out.println( "c2의 color =" c2.color +",
            gear Type="+ c2.gearType + ", door=" c2.door);
            
            c1.door=100;	// c1의 인스턴스변수 door의 값을 변경
            
            System.out.println("c1.door=100; 수행후");
            
            System.out.println( "c1의 color =" c1.color +",
            gear Type="+ c1.gearType + ", door=" c1.door);
            System.out.println( "c1의 color =" c1.color +",
            gear Type="+ c1.gearType + ", door=" c1.door);
        }
    }
    
    실행결과
    c1의 color = white, gearType=auto, door=4
    c2의 color = white, gearType=auto, door=4
    c1.door=100; 수행후
    c1의 color = white, gearType=auto, door=100
    c1의 color = white, gearType=auto, door=4
    インスタンスc 2は、c 1をコピーすることによって作成されるため、同じ状態を有するが、メモリ空間とは独立した個別のインスタンスであるため、c 1の値の変更はc 2に影響を及ぼさない.
    中間コンテンツを追加する必要があります
    インスタンスを作成する場合は、次の2点を確認する必要があります.
    1.クラス-どのクラスのインスタンスを作成しますか?
    2.コンストラクション関数-選択したクラスのどのコンストラクション関数を使用してインスタンスを作成しますか?