一、简介
Kotlin已正式成为Android官方支持开发语言。
二、工作原理
Java的运行机制:先编译为class文件(Android为dex文件),这个class/dex文件只有JVM/ART(Android移动优化版的虚拟机)才能识别,而虚拟机担任的就是解释器的角色,它会在程序运行时将编译后的class/dex文件解释成计算机可识别的二进制数据后再执行。
因此我们同样可以设计一门语言,然后自己做一个对应的编译器,让其将这门语言编译为同样规格的class/dex文件,虚拟机就可以识别了,这就是Kotlin的工作原理了。
三、优点
- 语法简洁。对于同样的功能,使用Kotlin开发的代码量,可能会比使用Java开发的减少50% 甚至更多
- 语法高级。相比于Java比较老旧的语法,Kotlin增加了很多现代高级语言的语法特性,使得开发效率大大提升。还有,Kotlin在语言安全性方面下了很多工夫,几乎杜绝了空指针这个全球崩溃率最高的异常
- 和Java是100%兼容的。Kotlin可以直接调用使用Java编写的代码,也可以无缝使用Java第三方的开源库。这使得Kotlin在加入了诸多新特性的同时,还继承了Java的全部财富
四、变量和函数
1. 变量
Kotlin具有出色的 类型推导机制,因此编译器可以知道声明变量的类型。
@Test
fun test() {
val a = 10
var b: Int = 10
println("a = " + a)
println("a = $a") println("b = ${b+1}")
}
Kotlin的类型推导机制并不能总是可以在正常工作,比如说如果我们对一个变量延迟赋值的话,Kotlin就无法自动推导它的类型了。这时候就需要显式地声明变量类型才行。
每行的代码不需要像Java一样加分号。
打印日志中的第二种写法和Dart(Flutter开发语言)相似,在“$”字符后方添加要打印的数据即可,若后方不是参数(如表达式),需要在外围使用“{}”字符包裹。
Kotlin完全抛弃了Java中的基本数据类型,全部使用了对象数据类型。
![c68c8f88056743e1bd834ad22ee28771.png](https://i-blog.csdnimg.cn/blog_migrate/875fff29de299842d8d9c11860242f6c.png)
2. 函数
函数和方法是同一个概念,只是不同语言的叫法习惯不一样而已。Java中方法的叫法更普遍一些,Kotlin中函数的叫法更普遍一些。
fun(function的简写)是定义函数的关键字,无论定义什么函数,都一定要使用fun来声明。参数括号后面的那部分是可选的,用于声明该函数会返回什么类型的数据,上述示例就表示该函数会返回一个Int类型的数据。如果函数不需要返回任何数据,这部分可以直接不写。
Kotlin函数的语法糖:当一个函数中只有一行代码时,Kotlin允许我们不必编写函数体,可以直接将唯一的一行代码写在函数定义的尾部,中间用等号连接即可。使用这种语法,return关键字也可以省略了,等号足以表达返回值的意思。由于param1 + param2返回的是一个Int值,而在函数的尾部又使用等号连接了param1 + param2,因此Kotlin可以推导出函数返回的必然也是一个Int值,这样就不用再显式地声明返回值类型了,代码可以进一步简化。
fun methodName(param1: Int, param2: Int): Int {
return param1 + param2
}
fun methodName(param1: Int, param2: Int): Int = param1 + param2
fun methodName(param1: Int, param2: Int) = param1 + param2
函数的可见性修饰符
![](https://i-blog.csdnimg.cn/blog_migrate/9a905dfda2f156ba7941d3c2694ac236.png)
五、程序的逻辑控制
程序的执行语句主要分为3种:顺序语句、条件语句和循环语句。
1. if条件语句
Kotlin中的if语句和Java中的if语句几乎没有任何区别。
fun largerNumber(num1: Int, num2: Int): Int {
var value = 0
if (num1 > num2) {
value = num1
} else {
value = num2
}
return value
}
fun largerNumber(num1: Int, num2: Int) = if (num1 > num2) num1 else num2
2. when条件语句
fun getScore(name: String) = when (name) {
//匹配值 -> { 执行逻辑 }
"Tom" -> 86
"Jim" -> 77
"Jack" -> 95
"Lily" -> 100
else -> 0
}
fun checkNumber(num: Number) {
when (num) {
is Int -> println("number is Int")
is Double -> println("number is Double")
else -> println("number not support")
}
}
fun getScore(name: String) = when {
name == "Tom" -> 86
name == "Jim" -> 77
name == "Jack" -> 95
name == "Lily" -> 100
else -> 0
}
3. 循环语句
val range = 0..10 //[0, 10]
遍历区间:
fun main() {
for (i in 0..10) {
println(i)
}
}
val range = 0 until 10 //[0, 10)
fun main() {
//相当于for-i循环中i = i + 2的效果
for (i in 0 until 10 step 2) {
println(i)
}
}
fun main() {
for (i in 10 downTo 1) { //[10, 1]
println(i)
}
}
六、面向对象编程
1. 类与对象
//为什么有一个open关键字往下看
open class Person {
var name = ""
var age = 0
fun eat() {
println("$name is eating. He is $age years old.")
}
}
fun main() {
val p = Person()
p.name = "Jack"
p.age = 19
p.eat()
}
2. 继承与构造函数
class Student : Person() { //为什么父类需要带上一个括号往下看
var sno = ""
var grade = 0
}
class Student(val sno: String, val grade: Int) : Person() {
init {
println("sno is $sno"
println("grade is $grade")
}
}
open class Person(val name: String, val age: Int) {
fun eat() {
println("$name is eating. He is $age years old.")
}
}
class Student(val sno: String, val grade: Int, name: String, age: Int) :
Person(name, age) {
...
}
}
class Student(val sno: String, val grade: Int, name: String, age: Int) : Person(name, age){
constructor(name: String, age: Int) : this("", 0, name, age) {
}
constructor() : this("", 0) {
}
}
class Student : Person {
constructor(name: String, age: Int) : super(name, age) {
}
}
3. 接口
interface Study {
fun readBooks()
//默认实现
fun doHomework() {
println("do homework default implementation.")
}
}
class Student(name: String, age: Int) : Person(name, age), Study {
override fun readBooks() {
println("$name is reading.")
}
//不实现也不会编译器报错
override fun doHomework() {
println("$name is doing homework.")
}
}
fun main() {
val student = Student("Jack", 19)
doStudy(student)
}
fun doStudy(study: Study) { //面向接口编程(多态)
study.readBooks()
study.doHomework()
}
4. 数据类与单例类
data class Cellphone(val brand: String, val price: Double)
//Singleton.singletonTest()
object Singleton {
fun singletonTest() {
println("singletonTest is called.")
}
}