Kotlin語法和使用

一,創建使用kotlin語言的工程
這裏寫圖片描述

二,支持java8
Project Structure,修改 Source Compatibility 和 Target Compatibility 選項到 1.8 即可使我們的項目支持 Java 8 語言特性。
這裏寫圖片描述

三,語法

變量

1.常量(val 相當於 java的 final)

val name:String = "";

2.變量

var view:View = LayoutInflater.from(this).inflate(R.layout.item_home,parent, false);

3.可爲空的變量

var name: String? = null;
var password:String? = "";

4.可以不指定類型

var testName = "test"

函數

1.定義函數(或方法)

fun onClickTest(view: View) {
}

2.定義帶返回值的函數

fun onClickTest(view: View) :String {
    return "";
}

3.定義返回值可爲空的函數

fun onClickTest(view: View) :String? {
    return null;
}

Kotlin類文件名爲*.kt,一個類可以有(0或1)個主構造函數或多個次構造函數
主構造函數:
i.可以將主構造函數中參數申明成類中成員變量

class Animal(var nameStr: String) {
            open fun test(){
                val testName = nameStr;
            }
}

ii.可以不作爲成員變量

class Food(name: String){
        lateinit var mName:String;
        init {
            mName = name;
        }
 }

次構造函數:

i.不能將次構造函數中參數申明成成員變量
如 以下是錯誤的

屏幕快照 2017-04-04 下午2.48.04.png

ii.如果有主構造函數,次構造函數必須要實現主構造函數,對象構造後會調用init 代碼塊

 class Food(name: String){
        lateinit var mName:String;
        init {
            mName = name;
        }
        constructor(nameStr: String, weight: Int) : this(nameStr) {

        }
 }

iii.子類的要實現父類的主構造函數

class Animal(var nameStr: String) {
        fun test(){
            val testName = nameStr;
        }
    }
    class Duck : Animal("鴨子") {
        override fun toString(): String {
            return "name:"+nameStr;
        }
    }
    class Dog(var name: String) : Animal(nameStr = name) {
        override fun test(){
            val testName = nameStr;
            this.name ="";
        }
    }
    class Pig(name: String, weight: Int) : Animal(nameStr = name) {

    }

內部類

Kotlin中內部類都是靜態的,如以下內部類Food無法調用外部成員變量parentVar

class KotlinActivity : AppCompatActivity() {
    var parentVar:String = "parent var";
    class Food(name: String){
        lateinit var mName:String;
        init {
            mName = name;
            mName = parentVar;
            mName = KotlinActivity().parentVar;
        }
        constructor(nameStr: String, weight: Int) : this(nameStr) {

        }
    }
}

非靜態內部類,需要用inner標示,如下:

class GameActivity : Activity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_game)
        start.setOnClickListener { gameView.start() }
    }

    fun onScoreChanged(scoreValue: Int) {
        score.text = scoreValue.toString()
    }

    override fun onPause() {
        super.onPause()
    }

    inner class Test{
        fun init(){
            var context = this@GameActivity.applicationContext;
        }
    }
}

接口

package com.ifnoif.game2048
import android.app.Activity
import android.os.Bundle
import kotlinx.android.synthetic.main.activity_game.*
import java.io.File
import java.io.FileFilter

class GameActivity : Activity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_game)
        start.setOnClickListener { gameView.start() }
    }

    fun onScoreChanged(scoreValue: Int) {
        score.text = scoreValue.toString()
    }
    inner class Test{
        fun init(){
            var context = this@GameActivity.applicationContext;
            var fileFilter: FileFilter = FileFilter { pathname: File -> var end = ".java"; pathname.absolutePath.endsWith(end) }
            //實現kotlin中的接口,不能整成上面那種匿名內部類的方式,需採用下面的方法
            var operation: Operation = object:Operation {
                override fun add(a: Int, b: Int): Int {
                    return a+b
                }
            }

            //kotlin中的抽象類也不能生成匿名內部類
            var add: Operation = object:Add() {
                override fun add(a: Int, b: Int): Int {
                    return a+b
                }
            }
        }
    }

    //抽象類
    abstract class Add(): Operation{

    }

    //定義接口interface
    interface Operation {
        fun add(a: Int, b: Int): Int;
    }
}

還可以使用typealias(聲明函數類型別名)

typealias Operate<T> = (a:T,b:T) -> T
fun init() {
    var operate: (Int, Int) -> Int = { a:Int, b:Int ->a+b}
    operate.invoke(1,2)
}

參考
http://www.jianshu.com/p/bb53cba6c8f4
http://www.jianshu.com/p/a47b63430943

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章