Kotlinでクラス宣言・コンストラクター・継承なんかを実際のコードで試してみます。クラス周りは言語や開発環境、開発ポリシー等々で使ったり使わなかったりと色々ありそうですが、Android Studio kotlinでの初学者向けということで記載しておきます。
Class
package com.example.appstudy17class
import android.util.Log
class Person2_Original(var name:String, var age:Int){
//コンストラクター省略
fun p(){
Log.d("dcheck2","名前:$name 年齢: $age")//これでデバッグLogを出力する
}
}
初心者の私は上記のクラス定義がしっくり来ます。
Class クラス名 (var 変数名:型 , var 変数名:型){ }
コンストラクター
コンストラクターとは!クラスが実体化したときに最初に起動する処理。というイメージですが、初期化機能と理解してもいいんじゃないでしょうか。
package com.example.appstudy17class
import android.util.Log
class Person (name:String,age:Int){
//プロパティー
var name:String
var age:Int
//コンストラクター
init {
this.name=name
this.age=age
}
fun p(){
Log.d("dcheck","名前:$name 年齢: $age")//これでデバッグLogを出力する
}
}
コンストラクターはinit{}部分で初期化していますが
class Person (name:String,age:Int){}を
class Person (var name:String, var age:Int){}と書けば
プロパティー宣言とinit{}部分を一辺で表現でき省略できます。
class Person (var name:String, var age:Int){
}
セカンダリーコンストラクタ
class Person3 (var name:String, var age:Int){
constructor(name:String):this(name,20)
//↑セカンダリーコンストラクター
fun p(){
Log.d("dcheck3","名前:$name 年齢: $age")//これでデバッグLogを出力する
}
}
セカンダリーコンストラクターとはコンストラクターのバリエーションの一つ!
まずはファーストコンストラクターでのclassの実体化は
var hoge = Person3(“ほげほげ”,18)
セカンダリーコンストラクターでのclassの実体化は
var hoge2 = Person3(“ほげほげほげ”)
セカンダリーコンストラクターを使う場合は年齢の引数(パラメータ)が不要になります。
コーデイングしている時のスニペットでは候補下がファーストコンストラクター、候補上がセカンダリーとして表示されています。クラスの実体化コーディングの違いにつながってきます。
継承
継承とは!元々あるClassに似たClassをコーデイングする時にまるまるパクる書き方。(表現が下品ですみません)
取敢えず元となるClassをまるまるパクっておいて、そこにメソッドを追加したり元のメソッドを上書きしたりする機能です。(ざっくりなんでツッコミなしで・・・)もちろん元Classにはなんら影響は発生しません。
継承元にはOpenキーワードを
//元Class
package com.example.appstudy17class
import android.util.Log
open class Person2_Original(var name:String, var age:Int){
open fun p(){
Log.d("dcheck2","名前:$name 年齢: $age")//これでデバッグLogを出力する
}
}
継承元ClassにはOpenキーワードが必要です。また継承元メソッドにもOpenキーワードが必要となります。
継承先ではコロンで継承 overrideで上書き
//継承先Class
package com.example.appstudy17class
import android.util.Log
class Nihonjin2(name: String, age: Int) : Person2_Original(name, age) {
override fun p(){
Log.d("OVERRIDE","名前:$name 年齢: $age オーバーライドしたよ")//これでデバッグLogを出力する
}
}
class Nihonjin2(name: String, age: Int) : Person2_Original(name, age) {}
上記のようにコロン以降に継承元クラス名を記述すれば継承は完了です。
また、クラスメソッドの上書きはoverrideキーワードをメソッドに追加するだけなんで上書きも簡単です。
ソース
package com.example.appstudy19
import android.util.Log
class integrationClass {
}
class Person (name:String,age:Int){
//プロパティー
var name:String
var age:Int
//コンストラクター
init {
this.name=name
this.age=age
}
fun p(){
Log.d("dcheck","名前:$name 年齢: $age")//これでデバッグLogを出力する
}
}
open class Person2_Original(var name:String, var age:Int){
//コンストラクター省略
open fun p(){
Log.d("dcheck2","名前:$name 年齢: $age")//これでデバッグLogを出力する
}
}
open class Person3 (var name:String, var age:Int){
constructor(name:String):this(name,20)
//↑セカンダリーコンストラクター
open fun p(){
Log.d("dcheck3","名前:$name 年齢: $age")//これでデバッグLogを出力する
}
}
class Person4 (var name:String, var age:Int){
constructor(name:String):this(name,20)
constructor():this("不明",99)
//↑複数コンストラクター
fun p(){
Log.d("dcheck4","名前:$name 年齢: $age")//これでデバッグLogを出力する
}
}
class Nihonjin(name: String, age: Int) : Person2_Original(name, age) {
}
class Nihonjin2(name: String, age: Int) : Person2_Original(name, age) {
override fun p(){
Log.d("OVERRIDE","名前:$name 年齢: $age オーバーライドしたよ")//これでデバッグLogを出力する
}
}
class Nihonjin3(name: String, age: Int) : Person3(name, age) {
constructor(name:String):this(name,20){}
override fun p(){
Log.d("OverRide3","名前:$name 年齢: $age オーバーライドしたよ")//これでデバッグLogを出力する
}
}
kotlinではclassファイル名とclass名はclass名にPublicをつけたclassと一致していれば問題ないのでclassを一つのファイルにまとめることができます。まとめるメリットがあればやってみましょう。
package com.example.appstudy19
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val tanaka = Person("tanaka",28)
tanaka.p()
//D/dcheck: 名前:tanaka 年齢: 28
val yoshida = Person2_Original("吉田",30)
yoshida.p()
//D/dcheck2: 名前:吉田 年齢: 30
//セカンダリーコンストラクター
val hayakawa = Person3("早川") //名前だけを渡す年年齢は渡さない
hayakawa.p()
//D/dcheck3: 名前:早川 年齢: 20
val hayase = Person3("早瀬",19)
hayase.p()
//D/dcheck3: 名前:早川 年齢: 20
//複数のセカンダリーコンストラクター
val nishikawa =Person4() //引数なし
nishikawa.p()
//D/dcheck4: 名前:不明 年齢: 99
//継承
val suzuki_nihonjin = Nihonjin("鈴木",24)
suzuki_nihonjin.p()
//D/dcheck2: 名前:鈴木 年齢: 24
//メソッドのオーバーライド
val satou_nihonjin = Nihonjin2("佐藤",25)
satou_nihonjin.p()
//D/OVERRIDE: 名前:佐藤 年齢: 25 オーバーライドしたよ
//複数コンストラクタクラスを継承
val yamada_nihonjin = Nihonjin3("山田")
yamada_nihonjin.p()
//D/OverRide3: 名前:山田 年齢: 20 オーバーライドしたよ
}
}
この投稿記事でのmain()部分であるclassのインスタンス化部分の記述になります。
まとめ
初学者は私を含めてClass宣言とインスタンス化、継承とオーバーライドを理解し実装しまくれば理解が深まると思います。書いて書いて書きまくって覚えましょう。
コメント