变量与函数
这是我参与「第四届青训营 」笔记创作活动的第3天
变量
Kotlin只允许在变量前声明两种关键字
val和var
- val声明一个不可变的变量,对应java中的final变量
- var声明一个可变的变量,初始赋值后再被重新赋值
Java和Kotlin数据类型对照表
函数
fun methodName(param1: Int, param2: Int): Int {
return 0
}
fun是定义函数的关键字,跟在后面的是函数名,括号中的是参数声明格式为参数名: 参数类型,括号后面则是声明函数返回类型。
定义一个函数,接收两个整型参数,然后总是返回两个参数中更大的那个数。
fun largerNumber(num1: Int, num2: Int): Int {
return max(num1, num2)
}
kotlin语法糖
Kotlin允许我们不必编写函数体,可以直接将唯一的一行代码写在函数定义的尾部,中间用等号连接即可。即上述代码可以简化如下形式
fun largerNumber(num1: Int, num2: Int): Int = max(num1, num2)
// fun largerNumber(num1: Int, num2: Int) = max(num1, num2)
逻辑控制
if
if语句在Java中几乎一致,主要记录下述不同之处
Kotlin中的if语句相比于Java有一个额外的功能,它是可以有返回值的,返回值就是if语句每一个条件中最后一行代码的返回值。
fun largerNumber(num1: Int, num2: Int): Int {
return if (num1 > num2) {
num1
} else {
num2
}
}
还可以结合语法糖使得代码更加精简
fun largerNumber(num1: Int, num2: Int) = if (num1 > num2) num1 else num2
when
when解决了Java switch的痛点,且增加了更多强大的特性
when(任意类型参数) {
匹配值 -> { 执行逻辑 }
// { }可以省略
}
定义一个函数根据姓名得到相应分数
fun getScore(name: String) = when {
name == "Jim" -> 77
name == "Jack" -> 95
else -> 0
}
循环语句
Kotlin提供了while循环和for循环,其中while循环不管是在语法还是使用技巧上都和Java中的while循环没有任何区别,但在for循环方面做了很大幅度的修改
// 表达出来就是[0, 10]
val range = 0..10
//可以使用for in遍历
for (i in range) {
println(i)
}
Kotlin中可以使用until关键字来创建一个左闭右开的区间,如val range = 0 until 10,它的数学表达方式是 [0, 10)
// 可以使用step关键字定义步长
// 每次执行循环都会在区间范围内递增2
for (i in 0 until 10 step 2) {
println(i)
}
创建一个降序的区间,可以使用downTo关键字,用法如下:
// 创建了一个[10, 1]的降序区间
for (i in 10 downTo 1) {
println(i)
}
面向对象编程
类与对象
新建一个Person类,右击文件夹选择Kotlin File/Class, 接着选择Class
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()
}
继承
在Kotlin中任何一个非抽象类默认都是不可以被继承的,相当于Java中给类声明了final关键字
所以为了使得person类可以继承需要在类前面加上关键字open
open class Person {
...
}
新建一个Student类继承Person类
class Student : Person() {
var sno = ""
var grade = 0
}
接口
Kotlin中的接口部分和Java几乎是完全一致的。
创建一个Study接口,并在接口中添加相关函数
interface Study {
fun readBooks()
fun doHomework()
}
接着让Student类去实现Study接口了,Kotlin中统一使用冒号便是继承和实现接口,使用override关键字来重写父类或者实现接口中的函数
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.")
}
}
在main()函数中编写如下代码来调用这两个接口中的函数
fun main() {
val student = Student("Jack", 19)
doStudy(student)
}
// 使用了多态的特性
fun doStudy(study: Study) {
study.readBooks()
study.doHomework()
}
Java和Kotlin函数可见性修饰符对照表
数据类与单例类
数据类通常占据着非常重要的角色,它们用于将服务器端或数据库中的数据映射到内存中,为编程逻辑提供数据模型的支持
创建一个数据类,只需要在类前添加关键字dataKotlin会根据主构造函数中的参数帮你将equals()、hashCode()、toString()等固定且无实际逻辑意义的方法自动生成,从而大大减少了开发的工作量。
data class Cellphone(val brand: String, val price: Double)
在kotlin中创建一个单例类只需要将class关键字改成object关键字即可
object Singleton {
fun singletonTest() {
println("singletonTest is called.")
}
}
//调用方式 Singleton.singletonTest()
Lambda编程
集合的创建与遍历
在Kotlin中创建一个包含许多水果名称的集合
val list = ArrayList()
list.add("Apple")
list.add("Banana")
list.add("Orange")
list.add("Pear")
list.add("Grape")
//此Kotlin专门提供了一个内置的listOf()函数来简化初始化集合的写法
val list = listOf("Apple", "Banana", "Orange", "Pear", "Grape")
使用for-in循环来遍历这个集合
fun main() {
val list = listOf("Apple", "Banana", "Orange", "Pear", "Grape")
for (fruit in list) {
println(fruit)
}
}
listOf()函数创建的是一个不可变的集合,不可变的集合指的就是该集合只能用于读取,我们无法对集合进行添加、修改或删除操作。可以使用mutableListOf()函数创建可变集合
fun main() {
val list = mutableListOf("Apple", "Banana", "Orange", "Pear", "Grape")
list.add("Watermelon")
for (fruit in list) {
println(fruit)
}
}
Map集合的使用
val map = HashMap()
map["Apple"] = 1
map["Banana"] = 2
map["Orange"] = 3
map["Pear"] = 4
map["Grape"] = 5
// 使用mapOf()和mutableMapOf()函数来继续简化Map的用法
val map = mapOf("Apple" to 1, "Banana" to 2, "Orange" to 3, "Pear" to 4, "Grape" to 5)
参考资料
- 第一行代码--Android(第三版)