本章主要了解kotlin中基本语法的使用
定义一个方法
方法的定义,在前面几章里面已经提到了一点,这里仔细了解一下
var a: Int = 0
fun getNum(num: Int): Int {
return a
}
fun setNum(num: Int) {
a = num
}
上面的方法相当于下面
int a = 0;
public int getNum(){
return a;
}
public void setNum(int num){
a = num;
}
现在主要来找不同,首先是fun,关于可见性修饰符 public private protect等我们待会再说
来看set方法,kotlin的参数名在数据类型之前,这个之前提到过,这是很容易搞错的一点,从 int num到现在的num:Int
另外就是kotlin中没有分号";"
第二点,就是返回值了,java的返回值在方法名之前,但是kotlin的返回值在之后,并且与方法名中间以冒号隔开
fun getNum(): Int { }
这里的Int就代表了要返回一个整数类型
第三点,本系列文章第二章提到过,kotlin对于默认的处理办法,如下
fun setNum(num: Int = 3) {
a = num
}
和之前的对比,多了一个 “ = 3”这样的句子,可以理解为默认值
同时我们在使用set方法时
可以这样
setNum(5)
也可以这样
setNum()
即如果我传了参数,就使用参数,没传参数就使用默认的参数,这样的一个方法相当于下面的两个java代码
public void setNum(){
setNum(3);
}
public void setNum(int num){
a = num;
}
对,极大的方便了方法的重载
另外,我提到过kotlin是空指针安全的,所以很明显这里有一个会出空指针的地方,比如没写默认值,还调用空设置
不存在的!
如果没有设置默认值,是不允许这样调用的,必须传入一个值
方法的简写
方法简写也是kotlin的一大特点,不仅仅是方法简写,类似于for if 乃至android的点击事件其实都存在着一部分方法简写,这就是kotlin 能节省代码量的原因,如下
fun sumNum(a:Int, b:Int) = a + b
java的代码我就不一一敲出来了,显而易见kotlin的优势,在这种简单的函数下,可以节约很多的时间,代码也更加的好看
其实普通的方法也进行了简写的,我们知道java中,每个方法都有返回值,所谓的无返回其实是返回了一个void,在kotlin中,其实也有类似于void的返回值,不过在kotlin中被默认省略了,如下
fun setNum(num : Int){
}
fun setNum(num : Int) : Unit{
}
这里的这个Unit就相当于java的void,是一个无类型的返回值
更多的简写在后面的学习中会慢慢的提到
字符串模板
关于字符串模板,在之前其实已经出现过很多次了
最简单的如下
var a = 1
println("a = $a")
可以看到里面出现了$这个标志,这个标志就是kotlin字符串模板的代表了
所谓字符串模板,其实比较类似于sql语句的用法了。在双引号包起来的字符串里引用常量。
这里的$a就是a所对应的值“1”,所以打印出来“a = 1”
复杂一点的就涉及到了公式了,在$标志后面添加一个{ },如下
var a = 1
println("a = ${a++}")
var b = "this is a test"
println("b = ${b.subString(3,7)}")
以上用法,在你只需要简单使用某个参数的值时,可以很方便的使用,不需要先定义一个参数再进行赋值,再使用。很好的避免了代码中参数复杂过多。
可见性修饰符
kotlin中的可见性修饰符和java中其实比较类似
分为public private protected internal
默认为public 可以不写,即public fun ....等同于fun...
不同的是,kotlin多了一个internal这个修饰符
internal代表了在当前模块中使用
即用internal修饰的参数或者方法,只在当前的方法或类中可以使用,相当于public,在其他方法或者类中无法使用,相当于private
类型检查与自动转型
类型检查用到了 is 这个操作符,使用方法如下
fun getText(test : Any){
if (test is String){
test.substring(0)
}
}
首先这个方法中,我们用到了Any
Kotlin中的any很显然相当于java中的object,具体就不再细说
我们来看 is的用法,其实很明显了,这个is 和java的 instanceof是一样一样的,是用来判断类型的,不过kotlin还提供了更加逆天的用法。自动转型。
我们通过if语句进行判断test是否属于String类型,如果是,可以看到,我直接在下面使用了
test.substring(0)
是的,当is语句判断成功后,我们的test已经被kotlin自动转换成了string类型了,可以直接调用针对于String才有的方法substring,同样的,如果我们test is Int成立,我们也可以对test进行Int类型的相关操作。
鼠标放在test上面,会有如下提示Smart cast to kotlin.String,自动转换成String类型
而且最重要的是,我们刚刚说到的,如果成立,也就是说,像下面这种
fun getText(test : Any){
if (test !is String){
test.substring(0)//会报错的
}
}
test !is String,test不属于String类型,代码会自动提示你,不允许这样做,这就从源头上避免了java中非常容易出现的一个exception,ClassCastException
downTo及step
这两个操作符,都是在循环体for里面进行使用的,如下
for (i in 0..10 step 2){
println(i)
}
应该容易看懂,这个step就是一个循环走几步的问题,换算成java可以理解成这样
for(int i = 0; i<=10; i+=2){
}
即,每次循环都走两步,在这种情况下打印出来的就是0 2 4 6 8 10
你可能会觉得其实也没有比java方便多少,但是在下面这种情况就不一样了
for (i in 0..10 step 3){
println(i)
}
前面step等于2,刚好能除尽,所以倒还好,那么当step等于3时,10是除不尽的,如果仍然用java的方法,当i = 9时,循环体加3,i=12,这之后如果用i去取某个集合的值,是会出现数组越界的。
而kotlin中,使用step,当走到9时,如果无法继续加了,是不会继续往12上取的。
打印的值就是0 3 6 9
然后就是downto的用法了,在第二章写for的时候,可能你想到过也尝试过,kotlin的循环没办法倒序,没办法像java一样实行i--这样的操作,i in 0..5也被办法写成i in 5..0,。
你可能会想到时候要用还需要先在外面建立一个倒序的集合再使用(事实上我之前也是这么想的,不然我也暂时想不到5..0这样的操作)
但是其实,kotlin已经考虑到了这个,并提供了downTo这个操作符。
for (i in 5 downTo 2){
println(i)
}
如上,进行的就是从5到2的倒序循环
PS:其实我仍然觉得5..2这样的操作更加深得我心
“三目运算符”
之所以这里的三目运算符我打了引号
因为kotlin中其实没有三目运算符这个东西,这里提到的三目运算时,指代的是?: 这个操作符
使用方法如下:
var a : String? = null
val b = a ?: 0
println(b)
可以看到,我们先定义了一个null的参数a,再使用了b = a ?: 0这样的语句
代表了如果a等于空,b就等于0,如果不等于空,b就等于a
是不是和java的三目运算符很相似,不过需要注意的是?:只能判断左边的参数是不是为null,如果是null才会返回右边的值,否则都是左边的值。
所以其实?:可以当做一个为了避免空指针的一个操作。kotlin在空指针安全上想了很多办法。
类型转换符as
as是kotlin提供的用于类型转换的操作符,使用如下
fun testAs(any : Any) : Int{
return any as Int
}
println(testAs(123))
注意,这只是确定是该类型的转换,并不能把String类型的“123”转成成Int类型的123
相应的转换应该像这样
var a = "123"
var b = a.toInt()
println(b)
这个之后再说。继续看as
as这个方法,如果出现了我上面提过的String as Int,是会出错的,ClassCastException,所以kotlin提供了安全的类型转换,as?
var a = "test"
var b = a as? Int
println(b)
如上,使用as?,如果转型失败,此时返回为null,b的值就为nul,
所以在使用as的使用,都建议使用as?,因为如果你想通过获取exception来判断不是该类型,来进行别的操作,你完全可以使用 is 这个操作符
Android开发,Kotlin的了解与学习(五)-----基本语法之集合相关