Kotlin这门语言的设计哲学是务实、简洁、安全、互操作性。而且是跨平台的,可以作为Android平台的开发语音,也可以开发后台等等。
首先,国际惯例,先来个“Hello World”程序来了解下kotlin。
fun main(args: Array<String>) {
println("Hello World")
}
从这一段代码中你能了解Kotlin的哪些信息呢?和Java语言有什么不同?
1、首先是方法已fun 开头
2、参数在前,类型在后,中间以 : 隔开
3、语句结束不需要以 ; 结尾
4、函数不需要定义在类里面
大家可以在在线kotlin编译网站(http://try.kotl.in)直接书写Kotlin代码来进行练习
基本数据类型
Kotlin中的类型是弱类型,使用var定义可读变量,使用val定义只读变量,val变量虽然是只读的但并不等于Java中的常量,这个大家可以通过 Tools-Kotlin-Show Kotlin Bytecode的Decompile来查看编译之后的代码来了解其区别。
val在初始化后是不可以改变其值的,但是其指向的对象属性是可以改变其属性值的。
fun main(args: Array<String>) {
val value: Int = 5
value = 8 // 此时value在编译的时候就会报错了
val p: Person = Person("lisi", 20)
p.name = "wangwu"//属性值可以更改,因为属性是var的
}
class Person(var name: String, var age: Int)
Kotlin中的基本数据类型有以下几种:
kotlin | java |
---|---|
Double | double |
Float | float |
Long | long |
Int | int |
Short | short |
Boolean | boolean |
这里我们看到kotlin的类型和Java中的装箱类型是一样的,但是咋Kotlin中是没有装箱类型的,只有基本数据类型,
val numd:Double = 3.0
val numf:Float = 3.0f
val numl:Long = 3L
val numi:Int = 5
val nums:Short = 2
val numb:Boolean = true
在kotlin中类型转换必须要显示转换 如:Int类型赋值给Long类型
val numi:Int = 5
val numl:Long = numi.toLong()
字符串模板
在kotlin中字符串模板使用 $ 来表示
for (i in 1..50) {
println("我是第 $i 个数据")
println("我是第 ${i+1} 个数据")
println("我是第 $i \"个数据\" ")
println("我是第 $$i 个数据")
}
1、直接在变量前面加 $ 符号
2、如需表示表达式 则使用${} 表示
3、如需使用 "" 则使用 \ 作为转义
4、如需使用$ 则在前面直接在加一个 $ 符号
区间与循环
在Kotlin中没有Java中的for循环 定义变量 变量++ 知道结束,在Kotlin中使用区间来代替简单的循环 使用 .. 来表示 比如 1..100 表示1到100的闭区间 , 1 until 100 表示1到100的开区间 100 downto 1 表示100到1每次减1 100 downto 1 step 2 表示100到1每次减2 等等
for (i in 1..100) {
println(i)
}
//1 2 3 ...... 100
for (i in 1..100 step 2) {
println(i)
}
//1 3 5 ...... 99
for (i in 1 until 100) {
println(i)
}
//1 2 3 ...... 99
for (i in 100 downTo 1) {
println(i)
}
//100 99 98 ...... 1
for (i in 100 downTo 1 step 2) {
println(i)
}
//100 98 96 ...... 2
//当condition为true是执行条件语句
while (condition){
}
//首先无条件执行一次do语句 然后当condition为true是执行条件语句
do {
} while (condition){
}
when语句
在Java中当我们需要满足某一个条件时执行代码通常使用 switch,但在kotlin中是没有switch的取而代之的则是 when语句,when语句比switch更强大,switch只支持基本类型 但是when 语句不仅仅支持基本类型 还支持表达式或者对象
for (i in 0..5) {
when (i) {
0 -> println(i)
1 -> println(i)
2 -> println(i)
3 -> println(i)
else -> throw RuntimeException("未有匹配数据")
}
}
智能转换
Kotlin中使用 is关键字代替Java中的 instanceof关键字 当使用了is 判断是某个类型后 则可以直接把其当做这个类型来使用 因为编译器已经将其智能转换了 当然你可以可以使用 as 关键字来将其显示的转换
fun main(args: Array<String>) {
val p: Person = Man()
if (p is Man) {
println(p.getManName()) //可以直接调用Man中的方法
}
val pw: Person = Woman()
if (pw is Woman) {
println((pw as Woman).getManName()) //可以通过as手动转换 但是编译器会提示灰色的"no cast needed"
}
}
interface Person
class Man() : Person {
fun getManName(): String {
return "xioaming"
}
}
class Woman() : Person {
fun getManName(): String {
return "xiaohong"
}
}
null安全
Kotin和Java的类型系统之间第一条也可能是最重要的一条区别是, Kotin对可空类型是显式的支持。这样可以明确的表示那个变量可以为null 那个不可以为null 可以有效的避免空指针异常(NullPointException)
安全调用运算符:?. 其允许你将一次null判断和调用 合并在一起使用
fun main(args: Array<String>) {
getStrLength(null) //打印null
getStrLength("hello") //打印 5
}
fun getStrLength(str: String?) {
println(str?.length)
}
参数类型String后面的?表示其可以为null 当传入null时则直接返回null 执行中断 不会执行.length方法 避免空指针异常
Elvis运算符:?: 这个操作符有点类似Java的三元运算符
fun main(args: Array<String>) {
println(getStrLength(null)) //打印 0
println(getStrLength("hello")) //打印 5
}
fun getStrLength(str: String?): Int {
return str?.length ?: 0 //当str为null时str?.length返回null与返回值Int类型不匹配,?: 表示当str?.length为null时则返回0
}
安全转换:as? 安全的类型转换 如果不可以转换则直接返回null 避免Clas sCastException异常
val person: Person = Man()
(person as? Man)?.getManName() //如果person可以转换为Man 则调用getManName()方法,否则 (person as? Man)返回null
非空断言:!! 表示对常量强制使用,不管其是否为null 直接调用,这有可能抛出空指针异常,所以尽量少用
val person: Person = Man()
(person as? Man)!!.getManName()
//当(person as? Man)类型转换不匹配时 则返回null 此时加!! 表示强制调用getManName()方法,这就有可能出现空指针异常