Kotlin基础

一、基础语法

1、var、val变量定义;val不可修改类似final;

var <变量名> :<类型> = <初始化值>

val <变量名> :<类型> = <初始化值>

如下定义:

    var name : String = “abc”
其中可以直接省略 类型,如:var name = "abc" // 类型推导

2、Fun函数定义;

与java不同的点,fun函数可以在类外定义函数;

Unit相当于java的 void返回,可以不写,默认返回Unit(Void)

fun main():Unit{

} 

具有返回值的例子:

fun:add(num1 : Int, num2 : Int): Int{

    return num1 + num2

}

fun:add2(num1:Int,num2:Int) = num1 + num2 //使用类型推导,推导出返回值为Int

可变参数、可变长的参数

fun:method(vararg value : Int){

    for( i :Int in value){

        println(i)

    }

}

lambda 表达式函数

var method : (Int,Int) -> Int = {num1,num2 - > num1+ num2}

var res:int= method(1,1)

3、String 使用

val name = “abc”

val age = 22

println(“name$name,  age$age”)//使用美元符号$拼接字符串

//换行,三个引号换行; .trimIndent() 函数去掉前置空格;

val info = """

        AAAAAA

        BBBBBB

 """.trimIndent()

4、Null机制检查

var name:String?=null

name?.length  //如果为null不执行,不会发生空指针异常 

name!!.length //如果为null,发送空指针异常

//Int? 返回类型,可以返回null

fun:test(name:String):Int?{

}

//三目运算符

var info:String?=null
info?.length ?: "info为null"

5、in 区间

for(i:int in 1..9){

}

for(i:int downTo 9..1){

}

in 其中只可以从小到大;downTo 是从大到小;

用in区间做判断,如:var value = 2;if(value in 1..100)

指定间隔 step, 如:for(i:int in 1..20 step 2),间隔2循环数组1-20的数

用于排除until,如:for(i : int in 1 until 10),排除10,输出1到9的数

二、比较和数组

1、比较

比较两个值

val name1 = “Alice”

val name2 = “Alice”

name1.equals(name2)  //true 不推荐这样写,而是推荐使用==

name1 == name2  //true

比较对象地址,使用三个等号===

val name1 = “Alice”

val name2 = “Alice”

name1 === name2  // 输出:false

2、数组

第一种模式

val nums : Array<Int> = arrayOf(1,2,3,4,5)

println(nums[0])

第二种模式,20个size,value = 0开始value取值0、20,然后每个value + 1001,

val nums:Array<Unit> = Array(20,{value:Int -> (value + 1001)} )

三、条件控制

if 是属于表达式,具有返回值。

val max : Int = if(num1 > num2) num1 else num2 // 表达式比较大小

val max :Int = if(num1 > num2){

    //TODO  ....代码

    num1

}else{

    //TODO  ....代码

    num2

}

switch 的写法,同时 when也具有返回值

基础写法

val num = 11

when(num){

    1->println("一")

    11->println("十一")

    else ->println("else")

}

//具有返回值写法

val num = 11

val str : String = when(num){

    1->{

        println("一")

        "一"

    }

    11-> { 

        println("十一")

        "十一"

    }

    else -> { 

        println("else")

        "else"

     }

}

四、循环和标签

标签 xxx@ 自定义的标签

class 类 系统会自带一个标签,如 class Person{} this@Person

循环

var items :List<String>  = listOf<String>("a","b","c")

for(item in items){

     println(item)

}

items.forEach{

    println(it)

}

遍历,打印下标

for(index in items.indices){

        println("下标:$index , 对应的值:${items[index]}")

}

五、类与对象

类 默认是public ,可以不需要添加public

空类,可以不需要{}

定义空类:

class Empty

构造函数(class类需要添加open修饰才可以被继承)

主构造函数、次构造函数

open class Person(id : Int){ // 主构造

        constructor(id : Int , name : String) : this(id){ // 次构造必须引入主构造 :this(id)

        }

      //构造函数重载

        constructor(id :Int , sex : Char): this(id){

        }

        //无参构造函数

        constructor(): this(12){

        }

}

定义对象,不能使用new

var p = Person() //调用无参构造

继承和实现 使用:继承。class类需要添加open修饰才可以被继承

class Student (id : Int): Person( id){

}

定义类的成员变量

class Student (id : Int): Person( id){

        lateinit var name : String  // lateinit  懒加加载初始化,kotlin中全部无默认值

       var age :Int  = 0

}

抽象类 与 接口

接口,默认都是open 修饰

interface Callback{

}

抽象类

abstract Person :Callback{ //多个接口,只需要用  逗号, 隔开

        abstract fun getId() : Int  

       abstract fun initView() : Unit  //返回空,可以不写 : Unit

} 

实现抽象类和接口

class Student :Person(){ //继承必须需要加() 表示是构造函数

    override  fun getId() : Int   = 33

    override  fun initView() { }

}

data 定义数据类(实体Bean);其中:data 字段的使用,可以快捷生成javaBean类

data class User(val id : Int, var name :String , val sex : Char)

//使用数据类(实体bean)‘

val user = User(11,"Alice","F")

克隆、复制

val(xId,xName,xSex) = user.copy()

println("xId:$xid ,xName:$xname,xSex:$xSex") 

//拒绝复制, 使用下划线 _

val(_,xName,xSex) = user.copy()

println("xId:$xid ,xName:$xname,xSex:$xSex") 

单例 ,使用object字段修饰

object Person{

    fun test(){

    }

}

//使用

Person.test()

单例模式,demo

class Test{

    object Holder{

        var instance = Test()

    }

    //使用派生companion object,实现static

    companion object{

            //在派生中写的代码逻辑,全部属于静态的

            fun getInstance() : Test {  // 简写:  fun getInstance() : Test = Holder.instance

                return Holder.instance

            }

    }

}

//使用

fun main(){

    var test : Test = Test.getInstance()

}

内部类必须使用inner 修饰,若没有inner,则是属于嵌套类,嵌套类不能访问外部类的成员

class Test{

    class Holder{ // 嵌套类

    }

    inner class Holder{ // 内部类 

    }

}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,509评论 6 504
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,806评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,875评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,441评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,488评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,365评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,190评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,062评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,500评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,706评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,834评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,559评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,167评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,779评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,912评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,958评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,779评论 2 354

推荐阅读更多精彩内容