变量
变量的声明通过val
或者var
关键字。val关键字类似于Java中的final关键字,要在声明变量是就对变量进行赋值,var关键字就是一般的变量,可以修改。我们更加偏向于val声明变量,如果你不知道变量是否会被进行修改,可以先用val声明,需要修改时改为使用var声明即可
函数
函数(function)又叫方法,是对一系列操作的整合。在Kotlin中使用fun
关键字声明一个函数。例如
fun largerNum(num1:Int, num2:Int){
return max(num1, num2)
}
这样写是调用了Kotlin的内置函数max
,来获取最大数字。
下面,是Kotlin的一个语法糖。如果你的函数语句可以写为只有一个语句,那么可以使用=
连接函数声明与函数体部分。
fun largerNum(num1:Int, num2:int) = max(num1, num2)
你可能会想,什么时候会用到一句语句?其实,我们的很多简单的逻辑代码都可以化简为一句,下面是一个简单的例子:我们不使用内置的max
函数,而是自己用if
来进行判断,那么可以写出如下的函数
fun largerNum(num1:Int, num2:Int){
var value = 0
if(num1 > num2) value = num1
else value = num2
return value
}
好吧,这样写似乎有点冗余,其实kotlin的if
语句是有返回值的,返回的值为最后一句语句,那么我们就可以简写为:
fun largerNum(num1:Int, num2:Int){
val value = if(num1 > num2) num1 else num2
return value
}
其实这样子写还是有点冗余,因为value只是充当了一个返回值的作用,我们可以直接返回if语句:
fun largerNum(num1:Int, num2:Int){
return if(num1 > num2) num1 else num2
}
这样,我们的函数中就只剩下一句话了,那么就可以直接使用=
连接了
fun largerNum(num1:Int, num2:Int) = if(num1 > num2) num1 else num2
这样看来是不是又简便了不少?
when关键字
when
关键字类似于java中的switch..case
语句,但是由于swich…case只能够判断基本数据类型,其局限性很大,所以Kotlin引入了when关键字
有参数的when
这种when的语法和switch…case极其相似。假设我要判断变量num的值,然后输出相应的中文,可以使用如下写法
when(num) {
0 -> {"零"}
1 -> {"一"}
2 -> {"二"}
3 -> {"三"}
//以此类推
else -> {"不是一个0~9的数字"}
}
其实when也是有返回值的,和if类似,也是最后一句话。我们可以将每句话的大括号去掉,变为如下模式:
when(num) {
0 -> "零"
1 -> "一"
2 -> "二"
3 -> "三"
//以此类推
else -> "不是一个0~9的数字"
}
又比如我们想判断变量num的类型,我们可以使用is
关键字,例如
when(num) {
is Int -> "num的类型是Int"
is Float -> "num的类型是Float"
is Double -> "num的类型是Double"
else -> "不受支持的类型"
}
这其中的
Int
、Float
、Double
是类,其实Kotlin舍弃了int等基本类型,相当于对这些基本类型做了一次二次封装,和Java的包装类相似
不带参数的when
这种when用到时非常好用,例如我要让getScore
函数传递过来的字符串name
中以"Tom"
开头的人的分数都是80,我们可以写出如下的代码(这里无法使用带有参数的when完成)
fun getScore(name:String) = when {
name.startsWith("Tom") -> 80
else -> 60
}
是不是非常容易理解?
循环
while循环
while循环与java的while循环并无太大区别。例如,我们要实现一个简单的1~100的奇偶判断,可以用如下方式写:
var i = 1
while(i <= 100){
when {
i % 2 == 0 -> println("$i 为偶数")
else -> println("$i 为奇数")
}
i++
}
$i
的写法是一种语法糖,叫做字符串模板,是一种可以在字符串内部书写变量的方式,只需要用美元符号打头就行,如果里面要是有.
运算符进行调研各种方法,那么需要使用{}
括起来,类似于"${str.toInt()}"
,是不是很方便?
for循环
上述使用while循环书写的方式似乎还是有点复杂,有没有更快的方法呢?答案当然是有的,使用for…in循环
前置知识
kotlin中有一个特殊的区间表示语法,例如[0,10]可以表示为0..10
,注意们这里是闭区间。众所周知,数组的下标是从0开始的,所以这可能不怎么符合各位写代码的逻辑。我猜测官方也考虑到了这点,于是就有了until
关键字。until
关键字能实现左闭右开的效果,即[0,10)的区间可以写为0 until 10
。当然官方也提供了倒序的语法,例如[10,0](这么些可能不符合数学上的定义,但是为了讲解方便就这们写了吧),可以写为10 downto 0
。当然,官方也提供了step
语法来进行步长的选择可以使用1..100 step 2
来筛选出奇数
正式讲解
有了如上的基础之后,我们便可以完成使用for..in
循环判断1~100的哪些数字是奇数还是偶数了
for(i in 1..100){
when {
i % 2 == 0 -> println("$i 为偶数")
else -> println("$i 为奇数")
}
}
是不是感觉方便了很多?
面向对象
在Kotlin中定义普通的类的方式与java相同,即使用class
关键字。下面是一个例子,我们定义一个Person
类,这个类中有age
,name
属性,有getInfo
方法,打印出该person实例的信息。
fun main(){
val person = Person()
person.name = "Jack"
person.age = 18
person.getInfo()
}
class Person {
var name = ""
var age = -1
fun getInfo(){
println("name: $name, age: $age")
}
}
运行结果为name: Jack, age: 18
。可以看出,定义的属性和方法默认为public
,这里我使用了var
关键字修饰而不是使用val
是因为后续需要对其进行修改,当然,如果之前有接触过面向对象的朋友应该知道构造方法。构造方法允许我们在实例化对象时就对其属性进行初始化,这时候可以声明为val了,但是如果后续的代码中还需要对其进行更改,还是要使用var关键字进行声明。