我是靠谱客的博主 正直小虾米,最近开发中收集的这篇文章主要介绍Kotlin:语法基础(二),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

一、变量和标识符
kotlin中的变量分为
val(不可变的):是只读的,仅能一次赋值,后面就不能被重新赋值;
var(可变的):是可写的。在它声明周期中可以被多次赋值。
只要可以,应尽量在kotlin中首选使用val不变值。因为在程序中大部分地方只需要使用不可变得变量,而使用val变量可以带来可预测的行为和线程安全等优点。

变量名就是标识符。变量名区分大小写,明明遵循驼峰式命名法。

二、关键字与修饰符
通常情况下,编程语言中都有一些具有特殊意义的标识符是不能用作变量名的,这些具有特殊意义的标识符叫做关键字(又称保留字),编译器需要针对这些关键字进行词法分析,这是编译器对源码进行编译的基础步骤之一。

Kotlin中的修饰符关键字主要分为:类修饰符,成员修饰符,访问权限修饰符,协变逆变修饰符,函数修饰符,属性修饰符,参数修饰符,具体化类型修饰符等。这些修饰符关键字 查阅《Kotlin 从入门到进阶实战》18页。

三、流程控制语句
流程控制语句分为:
分支语句(if ,when)
循环语句(for,while)
跳转语句(return break continue throw)

1、if表达式
if :参考《Kotlin 从入门到进阶实战》22页。

2、when表达式
when表达式类似于java中switch…case表达式,when语句的功能要更强大。

 caseWhen(3)
 caseWhen("hello kotlin")
 caseWhen('8')
 caseWhen("houlai")
 
 fun caseWhen(any : Any?) {
        when(any) {
            // 如果有跟多分支需要用相同的处理方式,则可以把多个分支条件放在一起,用逗号分隔
            1,2,3,4,5,6,7 ->  println("$any is a 1->7 number")
            "hello kotlin" ->println("the any is $any")
            // 可以是任意表达式(而不只是常量)作为分支条件
            is Char -> println("the any is char ,is $any")
            // else 分支类似于switch ... case 中default代码块
            else -> println("the any is else $any")
        }
    }
// 输出
I/System.out: 3 is a 1->7 number
I/System.out: the any is hello kotlin
I/System.out: the any is char ,is 8
I/System.out: the any is else houlai
// 阶乘实例
println("the fact is " + fact(10))
fun fact(n : Int) : Int{
        var result : Int = 0;
        when(n) {
            0,1 -> result = 1
            else -> result = n * fact(n - 1)
        }

        return result
}
// 输出:
I/System.out: the fact is 3628800

3、for循环
参考《Kotlin 从入门到进阶实战》24页。

4、while循环
参考《Kotlin 从入门到进阶实战》25页。

5、break 和continue
break语句用于完全结束一个循环,直接跳出循环体,然后执行循环后面的语句。
continue 语句是只终止本轮循环,但是还会继续下一轮循环。可以简单理解为直接在当前语句处中断,跳转到循环入口,执行下一轮循环。

6、return语句
详细参考《Kotlin 从入门到进阶实战》26页。
1)显示使用return语句

 fun sum(a:Int,b:Int) : Int {
        return a + b;
    }

2)使用“=”符号返回一个函数的值

// 一般情况
fun sum(a:Int,b:Int) : Int  = a + b

// 使用fun关键字声明了一个匿名函数,并且直接使用表达式来实现函数。
val sum = fun(a:Int,b:Int) : Int  = a + b

需要注意的是,后面的函数体语句中有没有大括号{}代表的意义完全不同

// 直接使用表达式声明函数。带上大括号{}的表达式返回的是一个Lambda表达式。
// {a + b}的类型是从(Kotlin.Int,Kotlin.Int)到()->Kotlin.Int的映射函数
val sumf = fun(a:Int,b:Int)   = {a + b}

// 调用sumf
println("sum5 = " + sumf(4,2)) // 返回值是一个函数()->Kotlin.Int,而不是具体的数值6
// 输出:I/System.out: sum5 = Function0<java.lang.Integer>  

// 调用sumf显示数值6
println("sum6 = " + sumf(4,2).invoke())
// 或:println("sum7 = " + sumf(4,2) ())
// 输出: I/System.out: sum6 = 6

在Kotlin中,()操作符对应的是类的重载函数,如invoke().我们使用()运算符来调用函数。
为了显示地指明return语句返回的地址,Kotlin还提供了@Label(标签)来控制返回值语句。

7、标签(label)
详细参考《Kotlin 从入门到进阶实战》29页。
在Kotlin中任何表达式都可以用标签(label)来标记。标签的格式为标识符后跟@符号,如abc@。

// label
        val intArray = intArrayOf(1,2,3,4,5,6)
        // here@ 是一个标签
        intArray.forEach here@{
            if (it == 3) return@here // 执行指令跳转到Lambda表达式标签here@处下一个it=4的遍历循环
            println("label :$it")
        }

输出如下:
在这里插入图片描述
我们在Lambda表达式开头处添加了标签here@,可以这么理解:该标签相当于记录了Lambda表达式的指令执行入口地址,然后在表达式内部使用return@here跳转到Lambda表示式中的该地址处。

也可以使用隐式标签,更加方便。该标签与接收该Lambda的函数同名。

 // label
        val intArray = intArrayOf(1,2,3,4,5,6)
        // here@ 是一个标签
        intArray.forEach {
            if (it == 4) return@forEach // 执行指令跳转到Lambda表达式标签here@处下一个it=4的遍历循环
            println("隐形label  :$it")
        }

输出:
在这里插入图片描述
8、throw表达式
在Kotlin中throw是表达式,它的类型是特殊类型Nothing。该类型没有值,与c java中的void意思一样。
详细参考《Kotlin 从入门到进阶实战》30页。没看懂

四、操作符与重载
详细参考《Kotlin 从入门到进阶实战》30页。

1、操作符优先级

2、一元操作符
1)前缀操作符
2)递增和递减操作符

3、二元操作符
1)算数运算符
2)字符串的“+”运算符重载
3)自定义重载的“+”运算符
4)in操作符
5)索引访问操作符
6)调用操作符
7)计算并赋值操作符
8)相等与不等操作符
9)Elvis操作符?:
10)比较操作符
11)用infix函数自定义中缀操作符

五、包声明
详细参考《Kotlin 从入门到进阶实战》38页。

最后

以上就是正直小虾米为你收集整理的Kotlin:语法基础(二)的全部内容,希望文章能够帮你解决Kotlin:语法基础(二)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(64)

评论列表共有 0 条评论

立即
投稿
返回
顶部