-->

2018年01月

Kotlinの変数はそのままではnullを代入できない。型の宣言の最期に?を付けることでnullの代入が可能になる。

    var str:String? = null

nullの代入を許す変数へのアクセスに?.を使うと変数がnullの場合nullを返してnullでない場合はその後に続くプロパティやメソッドを実行するように書ける。

    var str:String? = null
    println(str?.length)    // nullを表示

nullの場合、nullの代わりになにか値を返すには?:を使う。

    var str: String? = null
    println(str?.length ?: -1)      // -1を表示

nullの場合、例外を発生させ、null以外の場合はその値を返すには!!を使う。

    var str: String? = null
    println(str!!.length)      // 例外を発生

このエントリーをはてなブックマークに追加

配列はArray<T>クラスであらわされ、C言語などの配列と同じように[]で各項目にアクセスできる。配列の生成と初期化を行う場合、arrayOfを使う。

    var nums:Array<Int> = arrayOf(1, 2, 3)
    println(nums[0])    // 1を表示
    println(nums[1])    // 2を表示
    println(nums[2])    // 3を表示
    println(nums.size)  // 項目数(3)を表示

    var strs:Array<String> = arrayOf("abc", "def")
    println(strs[0])    // "abc"を表示
    println(strs[1])    // "def"を表示

配列の初期値が数列の場合、次のようにラムダ式を使って配列の生成と初期化ができる。

    // 偶数で初期化した配列(5個分)
    var evens = Array(5, {i -> i * 2})

    println(evens[0])   // 0を表示
    println(evens[1])   // 2を表示
    println(evens[2])   // 4を表示
    println(evens[3])   // 6を表示
    println(evens[4])   // 8を表示

プリミティブ型の配列を作る場合はByteArray、ShortArray、IntArrayなどを使う。これは、ボクシングオーバーヘッドのない配列が生成されるが、Array<T>の継承ではない。

    var nums:IntArray = intArrayOf(1, 2, 3)
    
    println(nums[0])    // 1を表示
    println(nums[1])    // 2を表示
    println(nums[2])    // 3を表示
    println(nums.size)  // 項目数(3)を表示

このエントリーをはてなブックマークに追加

あっ、大事なことを忘れていたw

コメントだ。

Javaなんかと同じように//で改行までのコメントと/* */でのブロックコメントに対応している。また、ブロックコメントはネスト可能になっている。


このエントリーをはてなブックマークに追加

メソッドとプロパティのオーバーライドは、こんな感じだ。

open class hoge {
    open var hoge1 = ""
    init {
        println("Init hoge")
    }

    open fun hoge() {
        println("hoge.hoge()")
    }
}

class hoge2:hoge() {
    override var hoge1: String
        get() = super.hoge1
        set(value) {
            println("set hoge2.hoge1")
            super.hoge1  = value
        }
    init {
        println("Init hoge2")
    }
    override fun hoge() {
        super.hoge()
        println("hoge2.hoge()")
    }
}

クラスの継承と一緒でメソッドやプロパティをオーバーライドするには、親クラスでopenをつけて宣言されていないといけない。
継承した方のクラスでoverrideを頭に付けて宣言する。
オーバーライドしたメソッド内で親クラスのメソッドを呼ぶにはsuperを使用する。


このエントリーをはてなブックマークに追加

継承はクラス名のあとに:(コロン)で継承元のクラス名を書いて親クラスのコンストラクタの引数を指定します。また、クラスをそのまま宣言するとデフォルトでは継承できないクラスになるので親クラスにはopenを付ける。こんなふうになる。

open class hoge {
    init {
        println("Init hoge")
    }
}

class hoge2:hoge() {
    init {
        println("Init hoge2")
    }
}

コンストラクタがある場合は、こんな感じだ。

open class hoge(a:String) {
    var hoge = a
    init {
        println("Init hoge")
    }
}

class hoge2(a:String):hoge(a) {
    init {
        println("Init hoge2")
    }
}

セカンダリコンストラクタで親クラスのコンストラクタを呼ぶ場合は、superを使う。こんな感じ。

class hoge2:hoge {
    constructor(a:String):super(a) {}
    init {
        println("Init hoge2")
    }
}

ちなみに上のソースではセカンダリコンストラクタで何も処理してないので最期の{}は省略できる。


このエントリーをはてなブックマークに追加

↑このページのトップヘ