KotlinDive

プログラミング言語 Kotlin についての入門ブログです。

クラス(継承)

Any

Kotlinでは、すべてのクラスは「Any」クラスを継承しています。
特に、親クラスについて指定していないクラスも、暗黙的に「Any」クラスを継承します。
なお、この「Any」はJavaの「java.lang.Object」とは別のクラスです。 「Any」には「equals()」「hashCode()」「toString()」という関数しかありません。


fun main(args: Array) {
    val student = Student()

    if (student is Any) {
        println("student is Any")
    } else {
        println("student is not Any")
    }
}

class Student

student is Any

クラスの継承

javaと違い、Kotlinのクラスはデフォルトでは継承させることができません。 つまり、Kotlinのクラスはデフォルトでfinalです。
(javaではデフォルトでは継承でき、finalをつけると継承不可能になります)
クラスを継承可能にするには「open」をクラスにつけます。
「open」なクラスを継承するには、クラスヘッダーでコロンを付けて親クラスを指定します。 </p


fun main(args: Array) {
    val student = Student("suzuki")

    if (student is Person) {
        println("student is Person")
    } else if (student is Any) {
        println("student is Any")
    } else {
        println("student is not Any")
    }
}

open class Person(name: String)

class Student(name: String): Person(name)

student is Person

子クラスがプライマリコンストラクタを持たない場合、親クラスのセカンダリコンストラクタに初期化処理を委譲することもできます。 子クラスのconstructorの後ろにコロンをつけて「super」で親クラスのセカンダリコンストラクタを呼び出します。


fun main(args: Array) {
    val student = Student("suzuki", 15, 80.0)

    println("name = ${student.name}")
    println("age = ${student.age}")
    println("score = ${student.score}")
}

open class Person(name: String) {
    val name = name
    var age = 0

    constructor(name: String, age: Int) : this(name) {
        this.age = age
    }
}

class Student : Person {
    var score = 0.0

    constructor(name: String, age: Int, score: Double) : super(name, age) {
        this.score = score
    }
}

name = suzuki
age = 15
score = 80.0

継承をする場合、親クラスのコンストラクタは必ず何らかの形で呼び出す必要があります。


fun main(args: Array) {
}

open class Person

// 親クラスのプライマリコンストラクタを読んでいるためOK
class Student: Person()

// 親クラスのセカンダリコンスtラクタを読んでいるためOK
class Teacher: Person {
    constructor(): super()
}

// 親クラスのプライマリコンストラクタもセカンダリコンストラクタもよんでいないためNG
// class Parent: Person