「プログラマに優しい現実指向JVM言語 Kotlin入門」で勉強して、、、（その２）

[その１](https://qiita.com/guijiu/items/27c5228405507e1d8402)から引き続き、
「[プログラマに優しい現実指向JVM言語 Kotlin入門](https://gihyo.jp/dev/serial/01/jvm-kotlin)」でKotlinを勉強しはじめました。
　説明が丁寧で、分かりやすいです。ただ一部、ソースコードの動作を確認しようとしたときに、mainルーチンがなかったりしたので、その部分を追記しました。（自分で悩まなかった部分は、飛ばしています。）
　説明など有益な情報を、ぜひ[原文：クラスを学ぶ](https://gihyo.jp/dev/serial/01/jvm-kotlin/0004)でご確認ください。
---
##リスト1　最小のクラス定義
```Kotlin:Klass01.kt
// https://gihyo.jp/dev/serial/01/jvm-kotlin/0004
class MyClass

fun main(){
    //リスト2　クラスのインスタンス化
    val obj = MyClass()
    println(obj) // => 例えば　MyClass@604e9f7f
}
```
## リスト3　メソッドを持ったクラス、リスト4　メソッドの呼び出し（まとめ）


```Kotlin:Klass02a.kt
// https://gihyo.jp/dev/serial/01/jvm-kotlin/0004

// リスト3　メソッドを持ったクラス
class Greeter {
    fun greet() {
        println("Hello!")
    }
}

// リスト4　メソッドの呼び出し 
class User {
    // 誤記？　多分ここにメソッドをひとつ加え、その中にGreeterクラスをインスタンス化して，そのインスタンスに対してgreetメソッドを呼び出さなければいけない。
    fun abc(){
        val greeter = Greeter()
        greeter.greet() // => Hello!
    }
}

fun main(){
    val u = User()
    u.abc()    
}
```
或いは、Userクラスをやめて、

```Kotlin:Klass02b.kt
// https://gihyo.jp/dev/serial/01/jvm-kotlin/0004

// リスト3　メソッドを持ったクラス
class Greeter {
    fun greet() {
        println("Hello!")
    }
}

// リスト4　メソッドの呼び出し 
    // 誤記？　原文（あるいはそれを解釈したKlass02b.kt）のUserクラスをやめて、mainメソッドの中にGreeterクラスをインスタンス化して，そのインスタンスに対してgreetメソッドを呼び出さなければいけない。

fun main() {
        val greeter = Greeter()
        greeter.greet() // => Hello!
}
```
## リスト5　プロパティを持ったクラス

```Kotlin:Klass03.kt
// https://gihyo.jp/dev/serial/01/jvm-kotlin/0004

// リスト3　メソッドを持ったクラス
class Greeter {
    fun greet() {
        println("Hello!")
    }
}

// リスト4　メソッドの呼び出し 
class User {
    fun abc(){
        val greeter = Greeter()
        greeter.greet() // => Hello!
    }
    
    //リスト5　プロパティを持ったクラス
    var id: Long = 0        //変数idとnameは書き換えるからvalではなくvarなんだろうな、きっと
    var name: String = ""
}

//リスト6　プロパティの使い方
fun main(){
    val taro = User()
    taro.name = "Taro"
    taro.id = 1234  // 追記しました
    println("${taro.name}(${taro.id})") // = > Taro(1234)
   
}

```

###リスト8　コンストラクタ引数でプロパティ初期化
```Kotlin:Klass04.kt
// https://gihyo.jp/dev/serial/01/jvm-kotlin/0004

// リスト3　メソッドを持ったクラス
class Greeter {
    fun greet() {
        println("Hello!")
    }
}

//リスト8　コンストラクタ引数でプロパティ初期化
class User(id: Long, name: String) {
    var id = id
    var name =name 
    
    fun abc(){
        val greeter = Greeter()
        greeter.greet() // => Hello!
    }
}

//リスト6　プロパティの使い方
fun main(){
    val taro = User(name = "Taro",id = 5678)
    println("${taro.name}(${taro.id})") // = > Taro(5678)
   
}
```

##リスト9　コンストラクタ引数でプロパティ定義
```Kotlin:Klass05.kt
// https://gihyo.jp/dev/serial/01/jvm-kotlin/0004

// リスト3　メソッドを持ったクラス
class Greeter {
    fun greet() {
        println("Hello!")
    }
}

//リスト9　コンストラクタ引数でプロパティ定義
class User(val id: Long, val name: String) {
    //var id = id   //コンストラクタ引数でプロパティ定義をすると、リスト８で行ったようなこの行とつぎの行のような定義はしてはいけないようだ。（この行をコメント//を削除するとエラーになる
    //var name =name 
    
    fun abc(){
        val greeter = Greeter()
        greeter.greet() // => Hello!
    }
}

//メインメソッド
fun main(){
    val taro = User(name = "Taro",id = 7856)
    println("${taro.name}(${taro.id})") // = > Taro(7856)
   
}
```
###リスト10　openなクラス、リスト11　Fooのサブクラス、リスト12　スーパクラスのメソッド呼び出しのまとめ
```Kotlin:Klass06.kt
// https://gihyo.jp/dev/serial/01/jvm-kotlin/0004

//リスト10　openなクラス
open class Foo {
  fun foo() {
  println("Foo")
  }
}

//リスト11　Fooのサブクラス
class Bar: Foo() {
  fun bar() {
    println("Bar")
  }
}

//メインメソッド
fun main(){
    //リスト12　スーパクラスのメソッド呼び出し
    val bar1: Bar = Bar()
    bar1.foo() // => Foo
    bar1.bar() // => Bar
    println()
    
    val bar2 = Bar()    // ｂａｒ２の型を省略（追記）
    bar2.foo() // => Foo
    bar2.bar() // => Bar
    println()
    
    val bar3: Foo = Bar()   // おそらくｊａｖａでいうところのアップキャストかな？（追記）
    bar3.foo() // => Foo
    //bar3.bar() // => Bar  //アップキャストしているから、コンパイルエラー
    println()
    
}

```

[その３](https://qiita.com/guijiu/items/1a2ea85bb330ad39906b)へ続く