LoginSignup
1
0

More than 3 years have passed since last update.

初めてkotlinを触る - クラス基礎(2)

Posted at
1 / 13

目次

  • ゲッターとセッター

    • 宣言
    • カスタムとバッキングフィールド
  • 継承

    • プライマリコンストラクタ
    • セカンダリコンストラクタ
    • メンバのオーバーライド
    • プロパティのオーバーライド

ゲッターとセッター


宣言

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)
  • javaと違いは、明示的にベースクラスをプライマリコンストラクタの引数を使用して初期化する
  • openをつけないと、エラーが発生
    • スクリーンショット 2019-08-20 20.13.51.png

セカンダリコンストラクタ


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
}
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0