🎈Kotlin紀行5日目


前回の旅行

  • オブジェクト向け
  • class
  • 作成者(メイン作成者、init)
  • 作成者(2)


    サブジェネレータ


    サブジェネレータはclass{constructor(パラメータ名:データ型)}を使用して宣言できます.
    class Car{
        constructor(color: String){
            println(color)
        }
    }
    
    fun main(args: Array<String>) {
        val K3 = Car("white")
    }
    セグメントジェネレータのパラメータcolorは、セグメントジェネレータでのみ使用できます.したがって、クラス全体で親ジェネレータのパラメータを使用する場合は、クラスのプロパティに代入する必要があります.
    class Car{
        var color:String=""
        constructor(color: String){
            this.color=color
        }
        fun carColor(){
            println(this.color)
        }
    }
    
    fun main(args: Array<String>) {
        val K3 = Car("white")
        K3.carColor()
    }

    プライマリおよびセカンダリジェネレータの使用


    1つのクラスに1つのプライマリジェネレータしかありません.
    複数の作成者が必要な場合は、プライマリ作成者とセカンダリ作成者を同時に使用する必要があります.
    プライマリ作成者が宣言されている場合は、セカンダリ作成者を宣言するときにプライマリ作成者を同時に呼び出す必要があります.
    class Car(color: String){
        init {
            println("주 생성자의 init")
        }
    
        constructor(color: String,name: String,number:Int):this(color){
            println("부 생성자")
        }
    }
    
    fun main(args: Array<String>) {
        val myCar = Car("white","k3",13)
    
    }
    上のコードでは、サブジェネレータの後ろにthis(color)が表示されます.
    これは、カラーでパラメータを受信する作成者、すなわちプライマリ作成者を呼び出すことを意味する.
    上記のコードを実行すると、

    これに基づいて、親ジェネレータを呼び出すときに、まずプライマリジェネレータを呼び出し、次にサブジェネレータを呼び出すことがわかります.

    getとset


    getとsetは、オブジェクトがPropertyを受信または変更するときに呼び出される関数です.
    本来はgetとsetを自動的に追加しますが、直接定義することもできます.
    class Car() {
        var name:String="Lee"
        get() {
            println("정보 호출")
            return field
        }
        set(value) {
        println("set 호출 "+value)
        field="my $value"}
    }
    Car classはname propertyでget関数とset関数を指定します.get関数は、オブジェクトのプロパティを呼び出すときに自動的に実行される関数です.
    main関数で
    fun main(args: Array<String>) {
        val myCar = Car()
        myCar.name
    }
    オブジェクト名.プロパティを使用する場合

    get関数を出力する「情報呼び出し」機能が機能し、フィールド値が返されます.ここで、フィールド値はPropertyの値です.
    set関数は、オブジェクトの構成を変更するときに自動的に実行される関数です.
    fun main(args: Array<String>) {
        val myCar = Car()
        myCar.name="k3"
    }

    プロセスの初期化


    classでPropertyを宣言する場合は、この値を初期化する必要があります.
    ただし、宣言後に値を初期化する必要がある場合があります.
    私はこのような状況にどのように対応するかを学びます.

    Initから初期化

    class Person() {
        val name:String
        val age:Int
        init {
            name="Lee Room"
            age=17
        }
    }
    上記のコードでnameとageを宣言すると、初期化されていなくてもコードは正常に動作します.
    Initは、オブジェクトを作成し、最初の実行時にPropertyを宣言するときに初期化する必要はありません.

    nullの初期化を許可する

    class Person{
        var name:String?=null
        var age:Int?=null
        constructor(name:String,age:Int){
            this.name=name
            this.age=age
        }
    }
    上記のコードのフォーマットは、Propertyの作成時にnullを初期値とし、ジェネレータの実行時にジェネレータのパラメータをPropertyに代入します.

    lateinit


    lateinit(遅延の初期化)は初期化時間を遅延します.
    class Person {
        lateinit var name: String
        fun initLate(name: String) {
            this.name = name
        }
    }
    上のコードでは、nameをlateinitに初期化した後、initLate関数が初期化します.lateinitを使用するとnullを追加することなく初期化時間を遅らせることができます.
    ただし、latinitは次の条件を満たす必要があります.
  • varと発表された
  • null
  • は許可されていません
  • 級身体で宣言した専門家だけが
  • を使用することができる.
  • Int、Floatなどのベース・タイプの製品では、
  • は使用できません.
  • 初期化前に使用できない
  • by lazy


    Lazyはvalとして宣言されたプロセスの初期化時間をプロセスが使用される時点に遅らせる.
    class Person {
        val name: String by lazy {
            println("by lazy")
            "Lee Room"
        }
    }
    上記のコードでは、bylazyによってname propertyを使用するときにname propertyを初期化できます.bylazyには、初期化時に実行される構文も含まれます.
    by lazyにも使用条件があります.
  • コールポイントが初期化されます.
  • valと宣言されるべきだ.
  • ただし、lateinitとは異なり、classの体以外でも使用でき、ベースタイプでも使用できます.

    今日の感想

  • 私が知っていることと他の人に説明したことは大きく違います.
  • まずここに