😄
【Kotlin】コンストラクタ(プライマリ / セカンダリ)
はじめに
Kotlin のコンストラクタについて学んだのでサンプルコードとともに残す。
Kotlin のコンストラクタ
まず、コンストラクタとはインスタンス生成時に自動で呼び出される機能のことである。
Kotlin のクラスには2種類のコンストラクタがある。
- プライマリコンストラクタ(クラスに一つだけ)
- セカンダリコンストラクタ(0個以上持つことができる)
プライマリコンストラクタ
基本構文
以下のように記述する(constructor
は省略するのが一般的)
class クラス名 constructor(引数: データ型) {}
サンプルコード
// constructorを省略
class Person (name: String, age: Int) {
var name: String
var age: Int
init {
// init{}内でコンストラクタ引数にアクセスできる
this.name = name
this.age = age
}
fun p() {
println("名前:$name 年齢:$age")
}
}
fun main() {
val tanaka = Person("田中", 28)
tanaka.p()
}
出力結果
名前:田中 年齢:28
初期化の省略が可能
- コンストラクタ引数に
var
val
をつけることでプロパティの宣言と初期化を同時に行うことが可能 - アクセス修飾子も付与できる
class Person (private val name: String, private val age: Int) {
fun p() {
println("名前:$name 年齢:$age")
}
}
fun main() {
val tanaka = Person("田中", 28)
tanaka.p()
}
出力結果
名前:田中 年齢:28
引数にデフォルト値の設定が可能
// age にデフォルト値をセット
class Person (private val name: String, private val age: Int = 25) {
fun p() {
println("名前:$name 年齢:$age")
}
}
fun main() {
val tanaka = Person("田中")
tanaka.p()
}
出力結果
名前:田中 年齢:25
セカンダリコンストラクタ
- クラスに0個以上持つことができる
- 最終的に必ずプライマリコンストラクタを呼び出す必要がある
基本構文
constructor(引数: データ型): this(引数)
サンプルコード
class Person (private val name: String, private val age: Int) {
// thisはプライマリコンストラクタを指す
constructor(name: String) : this(name, 20)
fun p() {
println("名前:$name 年齢:$age")
}
}
fun main() {
// セカンダリコンストラクタを呼ぶ
val suzuki = Person("スズキ")
suzuki.p()
}
出力結果
名前:スズキ 年齢:20
2つ以上のセカンダリコンストラクタを定義する場合
class Person (private val name: String, private val age: Int) {
// このthisはプライマリコンストラクタを指す
constructor(name: String) : this(name, 20) // ①
// このthisは ①のセカンダリコンストラクタを指す
constructor() : this("マツモト") // ②
fun p() {
println("名前:$name 年齢:$age")
}
}
fun main() {
// ②のセカンダリコンストラクタを呼ぶ
val matsumoto = Person()
matsumoto.p()
}
出力結果
名前:マツモト 年齢:20
上記サンプルコードでは
- ②のセカンダリコンストラクタ
- ①のセカンダリコンストラクタ
- プライマリコンストラクタ
の順番で処理が実行されている。
最後に
参考
ありがとうございました!!
Discussion