Kotlin学习系列(二)Kotlin语法基础

本系列内容均来自《Kotlin从小白到大牛》一书,感谢作者关东升老师。

标识符和关键字

1标识符

标识符就是变量、 常量、 函数、 属性、 类、 接口和扩展等由程序员指定的名字。 构成标识符的字符均有一定的规范, Kotlin语言中标识符的命名规则如下:

  1. 区分大小写: Myname与myname是两个不同的标识符。
  2. 首字符, 可以是下划线( _) 或字母, 但不能是数字。
  3. 除首字符外其他字符, 可以是下划线( _) 、 字母和数字。
  4. 硬关键字( Hard Keywords) 不能作为标识符, 软关键字( Soft Keywords) 、
    修饰符关键字( Modifier Keywords) 在它们的适用场景之外可以作为标识符使
    用。
  5. 特定标识符field和it。 在Kotlin语言中有两个由编译器定义的特定标识符, 它们
    只能在特定场景中使用有特定的作用, 而在其他的场景中可以做标识符使用。

标识符示例如下:

public fun main(args: Array<String>) {
    val `class` = "舞蹈学习班"//class是硬关键字, 前后添加反引号( `) , 可以用于声明标识符
    val `π` = 3.14159 //Unicode编码, 可以用于声明标识符
    var 您好 = "世界" //Unicode编码, 可以用于声明标识符
    var public = "共有的" //public是修饰符关键字, 可以用于声明变量标识符
    println(`class`)
    println(π)
    val it = 100 //it是普通标识符 ①
    val ary = arrayListOf<String>("A", "B", "C") //创建一个数组
    ary.forEach { println(it) } //it特定标识符 ②
}

其中class是关键字, 事实上反引号` 不是标识符的一部分, 它也可以用于其他标识
符, 如π和π是等价的。 代码第①行和第②行都使用it标识符, 代码第①行的it标识符
是普通标识符, 是由程序员定义的, 而代码第②行的it标识符是由编译器定义的,
forEach { println(it) }中的{ println(it) }是一个Lambda表达式, it参数引
用数组中元素。

2关键字

关键字是类似于标识符的保留字符序列, 由语言本身定义好的, Kotlin语言中有70多个
关键字, 全部是小写英文字母, 以及!和?等字符构成。 分为3个大类:

  1. 硬关键字( Hard Keywords) , 硬关键字任何情况下都不能作为标识符, 具体包括如下关键字。
    as、 as?、 break、 class、 continue、 do、 else、 false、 for、 fun、 if、
    in、 !in、 interface、 is、 !is、 null、 object、 package、 return、
    super、 this、 throw、 true、 try、 typealias、 val、 var、 when和while。
  2. 软关键字( Soft Keywords) , 软关键字是在它适用场景中不能作为标识符, 而其他场景中可以作为标识符, 具体包括如下关键字。
    by、 catch、 constructor、 delegate、 dynamic、 field、 file、
    finally、 get、 import、 init、 param、 property、 receiver、 set、
    setparam和where。
  3. 修饰符关键字( Modifier Keywords) , 修饰符关键字是一种特殊的软关键字,它们用来修饰函数、 类、 接口、 参数和属性等内容, 在此场景中不能作为标识符。 而其他场景中可以作为标识符, 具体包括如下关键字。
    abstract、 annotation、 companion、 const、 crossinline、 data、
    enum、 external、 final、 infix、 inner、 internal、 lateinit、
    noinline、 open、 operator、 out、 override、 private、 protected、
    public、 reified、 sealed、 suspend、 tailrec和vararg。

常量和变量

1 变量

在Kotlin中声明变量, 就是在标识符的前面加上关键字var, 示例代码如下:

var _Hello = "HelloWorld" //声明顶层变量 ①
public fun main(args: Array<String>) {
    _Hello = "Hello, World"
    var scoreForStudent: Float = 0.0f ②
    var y = 20 ③
    y = true //编译错误 ④
}

代码第①行、 第②行和第③行分别声明了三个变量。 第①行是顶层变量。 代码第②行在声明变量的同时指定数据类型是Float。 代码第③行声明变量时, 没有指定数据类型,
Kotlin编译器会根据上下文环境自动推导出来变量的数据类型, 例如变量y由于被赋值为
20, 20默认是Int类型, 所以y变量被推导为Int类型, 所以试图给y赋值true( 布尔值)时, 会发编译错误。

2 常量和只读变量

常量和只读变量一旦初始化后就不能再被修改。 在Kotlin声明常量是在标识符的前面加上val或const val关键字, 它们的区别如下。

  • val声明的是运行期常量, 常量是在运行时初始化的。
  • const val声明的是编译期常量, 常量是在编译时初始化只能用于顶层常量声明或声明对象中的常量声明, 而且只能是String或基本数据类型( 整数、 浮点等)
    注:编译期常量( const val) 相当于Java中public final static所修饰的常量。 而运行期常量( val) 相当于Java中final所修饰的常量。

示例代码如下:

const val MAX_COUNT = 1000 //声明顶层常量 ①
const val _Hello1 = "Hello, world" //声明顶层常量 ②
const val _Hello2 = StringBuilder("HelloWorld")//编译错误 ③

//声明对象
object UserDAO {
    const val MAX_COUNT = 100 //声明对象中的声明常量 ④
}

public fun main(args: Array<String>) {
    _Hello1 = "Hello, World" //编译错误 ⑤
    val scoreForStudent: Float = 0.0f ⑥
    val y = 20 ⑦
    y = 30 //编译错误 ⑧
    const val x = 10 //编译错误 ⑨
}

代码第①行和第②行分别声明了两个顶层常量, 它们都是运行期常量。
代码第③行业试图声明StringBuilder类型的运行期顶层常量, 但是这里会发生编译错误, 因为运行期顶层常量只能是String或基本数据类型。
代码第④行是在对象中声明常量, objectUserDAO{}是对象声明。
代码第⑨行试图在函数中运行期常量, 会发生编译错误, 因为运行期常量用于顶层常量或对象中常量声明。
代码第⑤行和第⑧行会发生编译错误, 因为这里试图修改_Hello1常量值。
代码第⑥行和第⑦行是声明运行时常量。 当然, 运行期常量也可以声明为顶层的。约定 常量其实就是只读变量, 编译期常量( const val) 是更为彻底的常量, 一旦编译之后就不能再修改了。 而运行期常量( val) 还可以根据程序的运行情况初始化。 为了描述方便,将运行期常量称为“只读变量”。 默认所说的常量是编译期常量。

3 使用var还是val?

在开发过程中, 有的时选择var还是val都能满足需求, 那么选择哪一个更好呢?
原则 如果两种方式都能满足需求情况下, 原则上优先考虑使用val声明。
因为一方面val声明的变量是只读, 一旦初始化后不能修改, 这可以避免程序运行过程中错误地修改变量内容; 另一方面在声明引用类型使用val, 对象的引用不会被修改, 但是引用内容可以修改, 这样会更加安全, 也符合函数式编程的技术要求。

语句与表达式

Kotlin代码是由关键字、 标识符、 语句和表达式等内容构成, 语句和表达式是代码的重要组成部分。

1 语句

语句关注的代码执行过程, 如for、 while和do-while等。 在Kotlin语言中, 一条语句结束后可以不加分号, 也可以加分号, 但是有一种情况必须加分号, 那就是多条语句写在一行的时候, 需要通过分号来区别语句:

 var a1: Int = 10; var a2: Int = 20;
2 表达式

表达式是一般位于赋值符( =) 的右边, 并且会返回明确的结果。 下列代码中10和20是最简单形式的表达式。

var a1 = 10
val a2 = 20

在上述代码中, 直接将表达式( 10和20) 赋值给变量或常量, 并没有指定数据类型, 这因为在Kotlin编译器可以根据上下文自动推断数据类型。 上述代码也可以指定数据类型。

var a1: Int = 10
val a2: Int = 20
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,080评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,422评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,630评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,554评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,662评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,856评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,014评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,752评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,212评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,541评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,687评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,347评论 4 331
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,973评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,777评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,006评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,406评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,576评论 2 349

推荐阅读更多精彩内容