目次
-
ゲッターとセッター
- 宣言
- カスタムとバッキングフィールド
-
継承
- プライマリコンストラクタ
- セカンダリコンストラクタ
- メンバのオーバーライド
- プロパティのオーバーライド
ゲッターとセッター
宣言
var <propertyName>: <PropertyType> [= <property_initializer>]
[<getter>]
[<setter>]
- 完全な構文
- イニシャライザ、ゲッターとセッターは必須ではない
宣言 - デフォルトでゲッターとセッター
class Car(p: Int) {
var init: Int
init {
init = p
}
}
fun main() {
var car = Car(4)
println(car.init) // 4
car.init = 2
println(car.init) // 2
}
宣言 - 読み取り専用
class Car(p: Int) {
val init = 1
}
fun main() {
var car = Car(4)
println(car.init)
car.init = 2 // error: can not be reassigned
}
- varの代わりにval(バルキーワード)
- セッターが使えない
カスタムとバッキングフィールド
class Ben(q: Int) {
var init = 1
set(value) {
field = value + 10
}
}
fun main() {
var ben = Ben(4)
ben.init = 2
println(ben.init) // 12
}
- カスタムでゲッターとセッターを実装できる
- Kotlinは自動バッキングフィールドを提供する
継承
openアノテーション
- クラスの open アノテーションは、Javaの final と反対
- openをつけているクラスは、その他のクラスがこのクラスから継承することができる
- デフォルトでは、Kotlinのすべてのクラスはfinalである
プライマリコンストラクタ
open class Base(p: Int)
class Car(p: Int) : Base(p)
セカンダリコンストラクタ
open class Base(p: Int) {
constructor(p: Int, q: String): this(p){}
}
class Car: Base {
constructor(p: Int): super(p){}
constructor(p: Int, q: String): super(p, q){}
}
fun main() {
var car1 = Car(4)
var car2 = Car(4,"a")
}
- セカンダリコンストラクタで継承する時に、superを使って初期化できる
メンバーのオーバーライド
open class Base(p: Int) {
open fun v(){}
fun w(){}
}
class Car(p: Int) : Base(p) {
override fun v(){}
}
- ファイナルクラス(例えば、 open アノテーションを持たないクラス)の中では、openメンバは禁止されている
- openメンバーを指定してサブクラス内でオーバライドできる
- override としてマークされているメンバは、それ自身がopen
プロパティのオーバライド
open class Base {
open val x: Int = 1
}
class Car : Base {
override val x: Int = 2
constructor(){}
}
fun main() {
var base = Base()
println(base.x) // 1
var car = Car()
println(car.x) //2
}