概要
Kotlinのコンストラクタの話の前に、クラスについて説明します。
KotlinもJavaと同じくオブジェクト指向言語になります。なので、クラスについての基本的概念もJavaと何ら変わりはありません。クラス定義もJavaと同じ「class」キーワードを使用します。
KotlinとJavaで大きく違うのはプロパティとコンストラクタになります。
プロパティ
Javaでいうプロパティは、privateなフィールドを設定し、基本的に他クラスから、それにアクセスするためのアクセサメソッドを用意します。
上記の組み合わせでプロパティと呼ばれ、Java以外の言語でも多く使用されています。
定義側と呼び出し側に分けて説明していきます。
<定義>
- Java(プロパティ)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
Class Employee(){ private int no; //ゲッター public String getNo(){ return this.no; } //セッター public void setNo(int no){ this.no=no; } } |
Kotlinの場合、自分でアクセサメソッドを記述する必要はありません。
Kotlinは変数宣言の際、valまたはvarキーワードが必要です。
- val:値の変更が不可(定数)
- var:値の変更が可能
<定義>
- Kotlin(プロパティ)
1 2 3 4 5 6 7 |
Class Employee(){ val no :Int var name : String } |
この記述でプロパティの設定は終わりです。Javaと比較するとだいぶスッキリしています。
アクセサメソッドは暗黙的に生成されます。ただし、valの場合は値を変更できないのでsetterは生成されません。
<呼び出し>
Kotlinで作成したEmployeeクラスはJavaからも使用することができます。その際は通常通りアクセサメソッドを使用して呼び出します。
Kotlinで呼び出す際はプロパティを直接参照する形で記述します。
- Kotlin(プロパティ)
1 2 3 4 5 6 7 8 9 |
fun main(args: Array<String>) { val emp = Employee() //インスタンス化 emp.name="小早川" // Employeeクラスのnameに値をセット println(emp.name) // Employeeクラスのnameの値を取得 } |
コンストラクタとはオブジェクト生成時に自動的に呼ばれる処理です。その性質からクラスのメンバの初期化処理等によく使用されます。クラスに1つ以上のコンストラクタが必ず存在します。
コンストラクタ
KotlinにおいてJavaと違うのは、コンストラクタを区別していることです。
Kotlinにはプライマリコンストラクタとセカンダリコンストラクタがあります。コンストラクタとはオブジェクト生成時に自動的に呼ばれる処理です。その性質からクラスのメンバの初期化処理等によく使用されます。クラスに1つ以上のコンストラクタが必ず存在します。
プライマリコンストラクタ
プライマリコンストラクタとはクラスの定義と同時に定義されるコンストラクタです。プライマリコンストラクタでできることは下記になります。
- プロパティの初期化処理
- インスタンス化の際に行いたい処理
init{}にインスタンス化の際に行いたい処理を書くことが可能です。
<定義>
- Kotlin(プライマリコンストラクタ)
1 2 3 4 5 6 7 8 9 10 11 |
Class Employee(val no:Int,val name:String){ //プライマリコンストラクタ init{ println("社員No:$no") println("社員名:$name") } } |
Kotlin(プライマリコンストラクタ)<呼び出し>
1 2 3 4 5 |
fun main()(args: Array<String>) { val emp = Employee(1,"小早川") //インスタンス化 } |
1 2 3 |
社員No:1 社員名:小早川 |
プライマリコンストラクタでプロパティno,nameを宣言し、init{}で表示をしています。<結果>
セカンダリコンストラクタ
コンストラクタを複数書くことができます。セカンダリコンストラクタはconstructorキーワードを使用して定義します。
- プライマリコンストラクタが記述してある場合、必ず呼び出す必要がある
- thisキーワードを使用してプライマリコンストラクタを呼び出す
<定義>
- Kotlin(セカンダリコンストラクタ)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
class Employee() { //プライマリコンストラクタ init { println("プライマリコンストラクタが呼ばれました") } constructor(no: Int ,name: String) : this() { //セカンダリコンストラクタ println("セカンダリコンストラクタが呼ばれ、" +no+"と"+name+"が代入されました。") } } |
Kotlin(セカンダリコンストラクタ)<呼び出し>
1 2 3 4 5 |
fun main()(args: Array<String>) { val emp = Employee(1,"小早川") //インスタンス化 } |
1 2 3 |
プライマリコンストラクタが呼ばれました セカンダリコンストラクタが呼ばれ、1と小早川が代入されました。 |
this()でプライマリコンストラクタを呼んでいます。<結果>
まとめ
- Kotlinのプロパティはアクセサメソッドを明示的に書く必要はない
- クラス定義時の()がプライマリコンストラクタ
- セカンダリコンストラクタでコンストラクタの複数定義可能
- プライマリコンストラクタを記述した場合、セカンダリコンストラクタで必ず呼ばなければならない