Kotlin開発基礎(二)
4993 ワード
私の最新の文章を最初に入手したい場合は、公衆番号:技術スパイ隊に注目してください. Kotlin開発基礎(一) Kotlin開発基礎(二) Kotlin開発基礎(三) クラス#クラス#
この文章は主にクラスの属性定義とgetterとsetter,コンストラクタ,主次コンストラクタに関する知識を紹介する.
宣言
クラスは
可視性の宣言
Kotlinには4つの可視性修飾子があります:
クラス属性
getter/setterおよびfiledキーワード
Kotlinでは
注意すべきは、getterとsetterを書き直すときに、初心者が犯しやすい間違いです.次のコードを見てください.
上のコードコンパイル中は何の問題もありませんが、実行しますか?
上記の
このような書き方はjavaコードに変換して何のコードか見てください.
Kotlinのデフォルトでは空は許可されていないため、変数を宣言するときは値を割り当てる必要がありますが、定義が始まると値を割り当てることができない場合があります.この場合、値を遅らせる必要があります.このときは
注意: のみに対応する. こうぞう
Kotlinのクラスがコンストラクション関数を必要とする場合、1つのプライマリコンストラクション関数と複数のセカンダリコンストラクション関数を持つことができ、もちろんコンストラクション関数がないこともできます.
しゅこうぞうかんすう
プライマリコンストラクション関数はクラス名の後にあります.書き方は以下の通りです.
クラスにコードがない場合は、一番後ろの括弧を省略して次のように書くことができます.
コンストラクション関数に注釈または可視性修飾子がある場合、コンストラクション関数には
プライマリコンストラクション関数にはコードブロックが存在しないため、コンストラクション関数にコードブロックがある場合は、
コンストラクション関数のパラメータ名に
にだんこうぞう
二次構造関数とも呼ばれる二次構造関数.二次構造関数については、主に以下の点があります.二次構造関数は クラスがプライマリコンストラクション関数を持つ場合、任意の2次コンストラクション関数は、直接または間接的に別の2次コンストラクション関数を介してプライマリコンストラクション関数をエージェントする必要があります. クラスの1つのコンストラクション関数エージェントは、キーワードthisを使用する必要があります.
例は次のとおりです.
このようなサブクラスを補完するサブコンストラクション関数は、親クラスに直接エージェントできない方法です.このクラスのプライマリまたはセカンダリ構造関数を指す必要がありますが、最終的にはプライマリ構造関数を指す必要があります.
まとめ
Kotlinの中の1つのクラスに対する宣言はJavaよりずっと簡単で、コード量もずいぶん少なくなって、特にデータクラスにとって、Kotlinの文法はJavaよりずっと簡潔で、コードの時間を節約します.
この文章は主にクラスの属性定義とgetterとsetter,コンストラクタ,主次コンストラクタに関する知識を紹介する.
宣言
クラスは
class
キーワードを使用して識別され、これはJavaと同じです.ただしkotlinではデフォルトクラスは継承できません.つまり、final
というタイプです.別の継承が必要な場合は、open
またはabstract
とマークする必要があります.可視性の宣言
Kotlinには4つの可視性修飾子があります:
private、protected、internal、public
.可視性修飾は、関数、プロパティ、クラス、オブジェクト、インタフェースに使用できますが、ローカル変数には使用できません.修飾子が明示的に指定されていない場合、デフォルトの修飾子はpublic
です.Javaのデフォルトタイプとは異なります.クラス属性
getter/setterおよびfiledキーワード
Kotlinでは
var
の変数に対してsetter
とgetter
の方法がデフォルトであり、val
の方法はgetter
の方法のみであり、もちろんgetter
とsetter
の方法を複写することもでき、一般的な書き方は以下の通りである.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()
}
}
コンストラクション関数のパラメータ名に
var
val
を付けると、このパラメータはクラスのメンバー変数であることを示します.また、コンストラクション関数に自動的に値が割り当てられ、デフォルトでは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
キーワードを省略できない.例は次のとおりです.
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よりずっと簡潔で、コードの時間を節約します.