<<< 返回专栏总目录

写在前面的话:首先需要明确一个前提,我们介绍的 Kotlin 是 Kotlin for JVM ,这也是 Kotlin 使用最广泛的地方。Kotlin 代码最终编译后的产物是 Java class 字节码,也就是遵循 Java 虚拟机规范。所以,我们在介绍原理的时候 ,通常会反编译 Kotlin 代码,明白这些语法糖背后对应的其实就是类似 Java 代码来实现的,如果你熟悉 Java 语言,那么我将带你快速而深入的掌握 Kotlin 这门语言。

函数和变量这两个概念是 Kotlin 中最基本的两个元素,在介绍其他概念之前,先介绍下这两个基本概念。

1. 变量的定义

Kotlin 中对变量的定义和 Java 不一样。在 Java 中通常以变量的类型开头,后面跟着变量名称。

Kotlin 定义变量的语法为: var/val name:Type

  • var 关键字是 variable 的简称,表示该变量可以被修改
  • val 关键字是 value 的简称,表示该变量一旦赋值后不能被修改
// 定义一个可以被修改的变量
var age : Int = 17
// 定义一个不可修改的变量
val id : String = "1000"

// 还可以省略变量类型
// Kotlin会类型推导出变量的类型
var age = 17
val id = "1000"

需要注意的是,val 表示该变量 引用不可变,但是对象里的内容可以变。

也许讲到这里,对这些语法你还是感觉有点新鲜或者陌生,下面我们通过反编译的方式来查看下 Kotlin 代码,我们新建 Test.kt 然后新建上面的两个变量:
在这里插入图片描述

反编译的结果如下:

public final class TestKt {
   private static int age = 17;
   @NotNull
   private static final String id = "1000";

   public static final int getAge() {
      return age;
   }

   public static final void setAge(int var0) {
      age = var0;
   }

   @NotNull
   public static final String getId() {
      return id;
   }
}

最终的产物和我们的熟悉的 Java 代码没有两样,使用 val 修饰的本质上就相当于 使用了 Java final 关键字修饰。为什么是 static 呢?因为这个变量,我们并没有放在一个 class 当中,而是作为 顶级变量

讲到这里,我相信大家对变量的定义已经不默认了,本质上和 Java 没有两样,只是换了一种定义的方式而已。

2. 函数入门

下面我们来定义一个函数:

fun max(a: Int, b: Int): Int {
    return if (a > b) a else b
}

对上面的函数做个解释:

  • fun 关键字用来定义一个函数
  • fun 关键字后面是函数名(max)
  • 括号中间是函数参数
  • 冒号后面是返回值类型
  • 语句可以不用分号结尾

如下图所示:
在这里插入图片描述

需要注意的是 Kotlin 中没有像 Java 中的 三元运算符

在 Java 中上面的 函数体 可以改成这样:

return (a > b) ? a : b

Kotlin 使用 if 语句来代替 三目运算符

我们面对 Kotlin 函数语法,我们可能是第一次见,同样地,我们使用反编译的方式来看下:

public final class TestKt {
   public static final int max(int a, int b) {
      return a > b ? a : b;
   }
}

可以看到他底层实现的样子,其实还是 Java 那一套,只是 Kotlin 使用的关键字变了而已。

3. 表达式和语句

我们在学习任何编程语言的时候,都会遇到两个概念:

  • 表达式(expressions)
  • 语句(statements)

可能有些开发者还搞不清什么是 表达式 ,什么是 语句

在不同的编程语言中对 表达式和语句的定义 可能会有一些细微的差别

3.1 Java 中表达式和语句

在 Java 中 一个 表达式 是由 变量操作符方法 调用组成, 用来得到某种类型的返回值

比如下面的 Java 官方文档的代码示例:

// cadence = 0 是表达式
int cadence = 0;

// anArray[0] = 100 是表达式
anArray[0] = 100;

// "Element 1 at index 0: " + anArray[0] 是表达式
System.out.println("Element 1 at index 0: " + anArray[0]);

// result = 1 + 2 是表达式
int result = 1 + 2; // result is now 3

// value1 == value2 是表达式
if (value1 == value2) 
    //"value1 == value2" 是表达式
    System.out.println("value1 == value2");

我们从中可以看出 表达式 会返回某种类型的值

Java 中的 语句 和人类自然语言的句子差不多,一个 Java 语句 形成一个完整的执行单元,语句以分号(;)结尾

有的表达式在末尾加上分号就变成语句了,如下面几种类型的表达式:

  • 赋值表达式
  • 任何使用了 ++ 或 – 的表达式
  • 方法调用
  • 创建对象表达式

如:

// 赋值语句
aValue = 8933.234

// 自增语句
aValue++;

// 方法调用语句
System.out.println("Hello World!");

// 创建对象语句
Bicycle myBike = new Bicycle();

除此之外,还有 声明语句(declaration statements),如:

// declaration statement
double aValue = 8933.234;

还有 控制流语句(control flow statements),它包括:

  • 选择语句 decision-making statements (if-then, if-then-else, switch)
  • 循环语句 looping statements (for, while, do-while)
  • 分支语句 branching statements (break, continue, return)

3.2 Kotlin 中表达式和语句

Kotlin 和 Java 中对表达式和语句的定义都是类似的

但是对于有些关键字是语句还是表达式和 Java 还是有些区别的

3.2.1. if/when

如上所述,在 Java 中所有的 控制流 都是语句

在 Kotlin 的控制流中除了 循环(for/while/do…while) ,其他的都是表达式

既然是表达式,那么它就是表示某种类型的数据,可以把它赋值给变量

val max = if (a > b) a else b
3.2.2. try

在 Java 中 try 异常处理是语句

在 Kotlin 中它是表达式:

fun readNumber(reader: BufferedReader) { 
    //将 try 赋值给 number 变量
    val number = try {
        Integer.parseInt(reader.readLine()) 
    } catch (e: NumberFormatException){ 
        return 
    }
    println(number) 
}
3.2.3 表达式体

上面的 max 函数,因为函数体只有一个表达式,我们可以改写成如下形式:

fun max (a:Int, b:Int) = if (a > b) a else b

可以看出我们把一个表达式赋值给一个函数,表达式的返回值就是函数的返回值

如果一个函数的函数体放在花括号({})中,我们说该函数有一个 区块体(block body)

如果一个函数直接返回一个表达式,我们说该函数有一个 表达式体(expression body)

为什么上面的 max 函数可以省略 return 关键字呢?

实际上任何一个变量和表达式都有一个类型;

Kotlin 每个函数都会有返回类型,这个后面介绍的函数的时候回继续讲解

表达式的类型,Kotlin 会通过 类型推导(type inference) 来得知该表达式的类型

然后把得到的类型当做函数的返回值类型。

4. 小结

至此,我们就详细的介绍了 Kotlin 中的变量定义、函数入门、表达式和语句。并且还是底层分析了变量、函数的实现,让我们快速而又深入的掌握它,同时,我们还介绍了 Java 表达式/语句 和 Kotlin 的异同。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐