一、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 可以根据变量的赋值进行类型推断,则无需在变量后再指定类型。如下示例:
四、编译时常量
- 编译时常量只能是常用的基本数据类型:(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反编译后字节码
#六、引用类型
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字节码中如下
#七、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信息"}")
}
十、函数头
// 函数默认都是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.
}
}