Kotlin基础进阶一

132 阅读4分钟

一、Kotlin语言声明变量与内置数据类型

  • 声明变量
可读可改  变量名    类型      值
var      name  : String = "xiaoli"
  • 内置数据类型
String      字符串
Char        单字符
Boolean     true/false
Int         整形
Double      小数
List        集合
Set         无重复的元素集合
Map         键值对的集合

内置数据类型,编译后会转为相应的Java 基本类型,如:

Float ---> java float

Int ---> java int

二、Kotlin语言的只读变量

永远不会被修改的变量

fun main() {

    // var 默认提示:变量永远不会被修改,建议修改成 val == 不可改变的(只读)
    val info : String = "MhyInfo"
//     info = "AA" // 不能修改-/啊!!11111111111?11111111111111111111111111111!!!!!!!!!!!!
    println(info)

    /*
      只读     变量名   类型   值
      val     age   : Int = 99
     */
    val age: Int = 99
//     age = 99 // 不能修改
    println(age)
}

三、类型推断

Kotlin 可以根据变量的赋值进行类型推断,则无需在变量后再指定类型。如下示例:

image.png

四、编译时常量

  • 编译时常量只能是常用的基本数据类型:(String,Double,Int,Float,Long,Short,Byte,Char,Boolean)
  • 编译时常量只能在函数之外定义,为什么?答:如果在函数之内定义,就必须在运行时才能调用函数赋值,何来编译时常量一说
  • 结论:编译时常量只能在函数之外定义,就可以在编译期间初始了
const val PI = 3.1415 // 定义编译时常量
fun main() {
    val info = "Derry info" // 这个称为 只读类型的变量
    // 提示:修饰符const不适用于 局部变量
//     const val PI = 45
    // const val PI2 = 3.1415 // 定义编译时常量
}

五、查看Kotlin反编译后字节码

image.png #六、引用类型

Java语言有两种数据类型: 第一种:基本类型:int double 等 第二种:引用类型 String 等

Kotlin语言只有一种数据类型: 看起来都是引用类型,实际上编译器会在Java字节码中,修改成 “基本类型”

fun main() {
    val age: Int = 99
    val pi: Float = 3.1415f
    val pi2: Double = 3.1415
    val isOk: Boolean = true
}

在Java字节码中如下

image.png #七、range表达式

fun main() {
    val number = 148

    // range 范围 从哪里 到哪里

    if (number in 10..59) {
        println("不及格")
    } else if (number in 0..9) {
        println("不及格并且分数很差")
    } else if (number in 60..100) {
        println("合格")
    } else if (number !in 0..100) {
        println("分数不在0到100范围内")
    }
}

#八、 when表达式

fun main() {
    val week = 1

    // Java的 if 语句
    // KT的 if 是表达式 有返回值的

    val info = when(week) {
        1 -> "今天是星期一,非常忙碌的一天开会"
        2 -> "今天是星期二,非常辛苦的写需求"
        3 -> "今天是星期三,努力写Bug中"
        4 -> "今天是星期四,发布版本到凌晨"
        5 -> "今天是星期五,淡定喝茶,一个Bug改一天"
        6 -> "今天是星期六,稍微加加班"
        7 -> "今天是星期七,看剧中,游玩中"
        else -> {
            println("养猪去了,忽略星期几")
        }
    }
    println(info) // void 关键字 无返回    用Unit类代替了java的void关键字
}

九、String模版

fun main() {
    val garden = "黄石公园"
    val time = 6

    println("今天天气很晴朗,去玩" + garden + ",玩了" +time +" 小时") // Java的写法
    println("今天天气很晴朗,去${garden}玩,玩了${time}小时") // 字符串模版的写法

    // KT的if是表达式,所以可以更灵活,  Java的if是语句,还有局限性
    val isLogin = false
    println("server response result: ${if (isLogin) "恭喜你,登录成功√" else "不恭喜,你登录失败了,请检查Request信息"}")
}

十、函数头

image.png

// 函数默认都是public
// 其实Kotlin的函数,更规范,先有输入,再有输出
private fun method01(age: Int, name: String) : Int {
    println("你的姓名是:$name,你的年龄是:$age")
    return 200
}

以上代码编译后 会转换为如下的Java代码:

private static final int method01(int age, String name) {
   String var2 = "你的姓名是:" + name + ",你的年龄是:" + age;
   boolean var3 = false;
   System.out.println(var2);
   return 200;
}

十一、函数参数的默认参数

fun main() {
    action01("lisi", 89)
    action02("wangwu")
    action03()

    action03("赵六", 76)
}

private fun action01(name: String, age: Int) {
    println("我的姓名是:$name, 我的年龄是:$age")
}

private fun action02(name: String, age: Int = 77) {
    println("我的姓名是:$name, 我的年龄是:$age")
}

private fun action03(name: String = "王五", age: Int = 67) {
    println("我的姓名是:$name, 我的年龄是:$age")
}

十二、具名函数参数

具名函数参数的优点是,不需要像Java那样参数传递需要按顺序进行对齐。

fun main() {
    loginAction(age = 99, userpwd = "123", usernam = "de", username = "Derry", phonenumber = "123456")
}
private fun loginAction(username: String, userpwd: String, phonenumber: String, age: Int, usernam: String) {
    println("username:$username, userpwd:$userpwd, phonenumber:$phonenumber, age:$age")
}

十三、Unit函数特点

// Java语言的void关键字(void是 无参数返回的 忽略类型) 但是他是关键字,不是类型,这很矛盾
// : Unit不写,默认也有,Unit代表  无参数返回的 忽略类型 == Unit类型类
private fun doWork() : Unit {
    return println()
}

private fun doWork2() {
    return println()
}

private fun doWork3() /*: Unit*/ {
    println()
}

十四 Nothing

package com.derry.s1

// TODO 20.Kotlin语言的Nothing类型特点
fun main() {
    show(99)
    show(-1)
}

private fun show(number: Int) {
    when(number) {
        -1 -> TODO("没有这种分数")
        in 0..59 -> println("分数不及格")
        in 60..70 -> println("分数及格")
        in 71..100 -> println("分数优秀")
    }
}

interface A {
    fun show()
}

class AImpl : A {
    override fun show() {
        // 下面这句话,不是注释提示,会终止程序的
        TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
    }

}