Kotlin開発基礎(二)

4993 ワード

私の最新の文章を最初に入手したい場合は、公衆番号:技術スパイ隊に注目してください.
  • Kotlin開発基礎(一)
  • Kotlin開発基礎(二)
  • Kotlin開発基礎(三)
  • クラス#クラス#
    この文章は主にクラスの属性定義とgetterとsetter,コンストラクタ,主次コンストラクタに関する知識を紹介する.
    宣言
    クラスはclassキーワードを使用して識別され、これはJavaと同じです.ただしkotlinではデフォルトクラスは継承できません.つまり、finalというタイプです.別の継承が必要な場合は、openまたはabstractとマークする必要があります.
    可視性の宣言
    Kotlinには4つの可視性修飾子があります:private、protected、internal、public.可視性修飾は、関数、プロパティ、クラス、オブジェクト、インタフェースに使用できますが、ローカル変数には使用できません.修飾子が明示的に指定されていない場合、デフォルトの修飾子はpublicです.Javaのデフォルトタイプとは異なります.
    クラス属性
    getter/setterおよびfiledキーワード
    Kotlinではvarの変数に対してsettergetterの方法がデフォルトであり、valの方法はgetterの方法のみであり、もちろんgettersetterの方法を複写することもでき、一般的な書き方は以下の通りである.
    var [: ] [= ]
        []
        []
    

    注意すべきは、getterとsetterを書き直すときに、初心者が犯しやすい間違いです.次のコードを見てください.
    class Person {
        var age: Int
            get() = age
            set(value) {
                age = value
            }
    }
    

    上のコードコンパイル中は何の問題もありませんが、実行しますか?StackOverflowErrorが発生していることがわかりました..どうしてこんなひどい間違いがあったのか.こんな簡単なコードを書くことができますか?ここではJavaへの移行方法を教えていきます.Tools--->Kotlin---->Show kotlin ByteCodeを通じて、ここでバイトコードに変換されて、とても見苦しいです.それからダイアログボックスの上でDeCompileをクリックしてJavaコードが現れました.上のコードが何を生成したか見てみましょう.
    public final class Person {
       public final int getAge() {
          return this.getAge();
       }
    
       public final void setAge(int value) {
          this.setAge(value);
       }
    }
    

    上記のgetterメソッドとsetterメソッドは、それぞれ独自のメソッドを呼び出します.StackOverflowErrorのエラーが発生しましたどうする?Kotlin政府もこの問題に気づいて、fieldのキーワードがありました.正しい書き方は以下の通りです.
    class Person {
        var age: Int = 0
            get() = field
            set(value) {
                field = value
            }
    }
    

    このような書き方はjavaコードに変換して何のコードか見てください.
  • field識別子は、属性のアクセサ内でのみ使用できます.
  • lateinitキーワード
    Kotlinのデフォルトでは空は許可されていないため、変数を宣言するときは値を割り当てる必要がありますが、定義が始まると値を割り当てることができない場合があります.この場合、値を遅らせる必要があります.このときはlateinitキーワードで表記します.例は次のとおりです.
    lateinit var ageStr: String
    

    注意:
  • lateinitは、var型の変数
  • のみに対応する.
  • lateinitベースタイプには使用できません.なぜなら、ベースタイプにnullがない場合
  • こうぞう
    Kotlinのクラスがコンストラクション関数を必要とする場合、1つのプライマリコンストラクション関数と複数のセカンダリコンストラクション関数を持つことができ、もちろんコンストラクション関数がないこともできます.
    しゅこうぞうかんすう
    プライマリコンストラクション関数はクラス名の後にあります.書き方は以下の通りです.
    class Person(name: String) {
        /// some code ****
    }
    

    クラスにコードがない場合は、一番後ろの括弧を省略して次のように書くことができます.
    class Person(name: String) 
    

    コンストラクション関数に注釈または可視性修飾子がある場合、コンストラクション関数にはconstructorのキーワードが必要です.以下のようにします.
    class Person private constructor(name: String) 
    
    privateとは、構造方法がprivateのタイプであることを意味する.
    プライマリコンストラクション関数にはコードブロックが存在しないため、コンストラクション関数にコードブロックがある場合は、init{}文ブロックを使用してinitコードブロックに初期文を書き、コードブロックにコンストラクション関数のプロパティにアクセスし、いくつかの文ブロックを実行する必要があります.例は次のとおりです.
    class Person(name: String) {
        private var mName: String
        init {
            println("init")
            mName = name.toUpperCase()
        }
    }
    

    コンストラクション関数のパラメータ名にvarvalを付けると、このパラメータはクラスのメンバー変数であることを示します.また、コンストラクション関数に自動的に値が割り当てられ、デフォルトではgetメソッドとsetメソッドが生成されます.外部にアクセスしたくない場合はprivate修飾子を追加すればよい.サンプルコードは次のとおりです.
    //     private name:String    ,   get  (  set   val   )
    class TestClass(val name:String) {
        fun test() {
            Log.v("TestClass","name = $name")
        }
    }
    //          name   
    class TestClass(private var name:String) {
        fun test() {
            Log.v("TestClass","name = $name")
        }
    }
    

    にだんこうぞう
    二次構造関数とも呼ばれる二次構造関数.二次構造関数については、主に以下の点があります.
  • 二次構造関数はconstructorキーワードを省略できない.
  • クラスがプライマリコンストラクション関数を持つ場合、任意の2次コンストラクション関数は、直接または間接的に別の2次コンストラクション関数を介してプライマリコンストラクション関数をエージェントする必要があります.
  • クラスの1つのコンストラクション関数エージェントは、キーワードthisを使用する必要があります.

  • 例は次のとおりです.
    class Person constructor(id: Int) {//(    No.0)     
        var id = id//        id
        var name = ""
        var age = 0
        //(    No.1)         
        constructor(name: String, id: Int) : this(id) {
            this.name = name
        }
        //(    No.2)       No.1,         
        constructor(name: String, age: Int, id: Int) : this(name, id) {
            this.age = age
        }
    }
    

    このようなサブクラスを補完するサブコンストラクション関数は、親クラスに直接エージェントできない方法です.このクラスのプライマリまたはセカンダリ構造関数を指す必要がありますが、最終的にはプライマリ構造関数を指す必要があります.
    まとめ
    Kotlinの中の1つのクラスに対する宣言はJavaよりずっと簡単で、コード量もずいぶん少なくなって、特にデータクラスにとって、Kotlinの文法はJavaよりずっと簡潔で、コードの時間を節約します.