1. 上一页:目录
  2. 下一页:第2章
Kotlin:图解指南 • 第 1 章

变量、表达式与类型

Chapter cover image
阿基米德正在思考该如何命名他的常量……

想成为一名 Kotlin 程序员?

来对地方了!

本书将带你学习 Kotlin 的基础知识,循序渐进地介绍该语言的核心概念,帮助你成为一名熟练的 Kotlin 开发者。即使你已经是经验丰富的老手,了解这些基础知识也非常重要,可以帮你建立扎实的理解基础,从而发挥出最大的效能。

你的探险从第1章开始,我们将介绍变量、表达式和类型的基础知识。

开始吧!


变量简介

这是一个圆。

A circle

几千年前,一位名叫阿基米德的希腊人大致算出了如何测量圆外周的长度,称为周长。你大概还记得初中时学过的那个公式:

Circumference = 2 x pi x r Circumference = 2  r

“圆的周长等于2倍π乘以圆的半径。”

在上述公式中,字母 r 本身不是一个数字,它是一个代表半径的字母——一个衡量从圆心到圆边距离的数字。

The circumference of a circle c i r c u m f e r e n c e r

我们把 r 称为变量,因为半径会随着圆的大小变化。换句话说,变量 r 本身不是一个数字;它只是一个“桶”,用来盛放一个数字——任意数字。

An empty bucket r

变量不只用于代数和几何。在编程中也经常用到它们,作用相同:保存值。在 Kotlin 中,你可以这样创建一个变量并存入一个数字:

var r = 5.2

这行代码实际上做了件事。

Variable declaration and assignment var r = 5.2 assignment declaration
  1. 当我们写 var r 时,我们在声明一个名为 r 的新变量。你可以把声明变量理解为创建一个桶
  2. 当我们写 r = 5.2 时,我们在把值 5.2 赋给变量 r。换句话说,我们把数字 5.2 放入桶中
A bucket with the value 5.2 r 5.2

我们来分析这行代码的三个主要部分:

The keyword, the variable name, and the value var r = 5.2 variable name keyword value

在这段代码中……

  • var 是一个关键字,告诉 Kotlin 创建一个新变量。
  • r 是变量的名称,也被称为变量的标识符
  • 数字 5.2 是被赋予的

var 只是我们在学习 Kotlin 过程中会遇到的众多关键字之一。关于关键字,最重要的一点是:它们不能用作你自己定义的名称。例如,你不能把 var 用作变量的名称:

var var = 5
Error

我们在后续章节中还会遇到其他关键字。

重新赋值

如前所述,在公式 2πr 中,变量 r不同情况下可以代表不同的数字。

Circles of different sizes 10.0 5.2 6.7

在 Kotlin 中,如果你想让 r 代表一个不同的数字,只需重新赋值即可,如第二行所示:

var r = 5.2
r = 6.7

重新赋值时,我们无需再次使用 var 关键字,因为该变量已在第一行声明过了。

不可重新赋值的变量

我们再来看看周长公式:

Circumference = 2 x pi x r Circumference = 2  r

希腊字母 π(发音类似“pie”)与变量 r 有很大不同。r 可以保存任意数字,而 π 永远只保存一个非常特定的数字,我们将其近似为 3.14。

同样地,在用 Kotlin 编程时,有时你希望确保某个变量永远不改变。

A bucket that only ever holds one thing 3.14 6.28

在这种情况下,不用 var 声明,而是用 val 声明,如下所示:

val π = 3.14

现在,如果你试图重新赋值 π,就会收到错误:

val π = 3.14
π = 1.23
Error

一旦把东西放入这个桶,就再也无法替换了!

val 声明变量是防止意外修改不该改变的内容的好方法。事实上,一个很好的做法是始终先用 val,只有在绝对必要时才切换到 var

变量命名

用字母 π 写代码很有趣,但除非你在希腊,否则你的键盘上可能没有这个字符。从现在起,我们将用 pi 来命名它,让每个人都能方便操作。另外,我们也不再用 r,改用 radius,这样其他开发者看到代码时就能准确知道这个变量代表什么——我们不想让别人猜 r 代表什么!

有时变量标识符需要不止一个单词。在 Kotlin 中,惯例是第一个单词首字母小写,其余单词首字母大写,如下所示:

var radiusOfTheCircle = 5.2

既然已经掌握了声明和赋值变量的基础知识,我们就可以开始赋值更复杂的计算了,比如我们的周长公式!让我们深入学习表达式

Kotlin 中的表达式与语句

我们再来看看那个公式:

Circumference = 2 x pi x r Circumference = 2  r

我们已经创建了 piradius 的变量,现在只需让 Kotlin 为我们做一些数学运算,就能得到任意圆的周长,无论圆有多大。

我们只需将 2piradius 相乘。在 Kotlin 及大多数编程语言中,乘法不用 x 表示,而是用星号 * 表示,所以代码如下:

var radius = 5.2
val pi = 3.14

val circumference = 2 * pi * radius

到目前为止,我们只赋过简单的值——比如 5.23.14。这是我们第一次赋值更复杂的内容:2 * pi * radius

当 Kotlin 看到这行代码时,它会直接为你计算结果——将 2 乘以 pi 再乘以 radius,然后把结果值赋给名为 circumference 的变量。在本例中(半径为 5.2),circumference 将等于 32.656

A circle with the circumference calculated. c i r c u m f e r e n c e r 32.656 5.2

由于 2 * pi * radius 可以像这样计算出一个,我们说它可以被求值。能被求值的代码叫做表达式。以下是一些表达式的例子:

  • 2 + 3
  • 2 * pi * r
  • pi * r * r

变量本身也是表达式——它们会求值为所保存的值:

  • radius
  • pi

当你手动输入一个数字(而不是输入变量名)时,这称为数字字面量。字面量本身也是表达式——它们求值为自身!以下是一些例子:

  • 2
  • 5.2
  • 3.14

所有这些例子都会求值为某个值。另一方面,如果一段代码不能求值为某个值,则称为语句

下面是一个简单的经验法则,帮助你判断是表达式还是语句:

规则: 如果一段代码可以赋值给变量,那它就是表达式;否则,就是语句。

我们把这条规则应用到上面三个列表中第一个表达式(2 + 3radius2)上。下面高亮的部分就是表达式:

val a = 2 + 3
val b = radius
val c = 2

由于这些都可以赋值给变量,它们都是表达式。

到目前为止,我们见过的唯一语句赋值语句,例如 val pi = 3.14。把我们的经验法则应用于赋值语句看起来令人困惑,因为我们是在赋值中使用赋值(绕晕了!):

val a = val pi = 3.14
Error

如果你这样做,Kotlin 会给出一条有用的错误信息:“Expecting an expression”(期望一个表达式)。如果你看到这条错误信息,只是意味着你在 Kotlin 期望表达式的地方使用了语句。

语句表达式的区分在学习 Kotlin 时非常重要,本书中我们会经常用到这两个术语。

到目前为止,无论使用字面量还是复杂表达式,我们给变量赋的值始终是数字。但变量可以保存很多种不同的东西!接下来我们来探索一些。

类型:不同种类的值

在 Kotlin 中,不同的变量可以保存不同种类的值。变量所保存值的种类称为它的类型

我们再来看看变量 radiuspi

var radius = 5.2
val pi = 3.14

在本例中,radiuspi 都代表带小数点的数字,这种类型在 Kotlin 中称为 Double。如果你愿意,可以自己告诉 Kotlin 变量的类型,如下所示:

var radius: Double = 5.2
val pi: Double = 3.14

这样做时,我们是在显式指定类型。

很多时候,你不需要自己指定变量的类型。在这种情况下,Kotlin 会根据你赋给变量的值尽力推断类型。这个过程称为类型推断

因此,当我们这样写时……

var radius = 5.2

……Kotlin 可以判断出 5.2Double,因此会自动Double 用作 radius 的类型。

除了 Double,还有一些其他的基本类型值得了解!我们现在来看看。

整数

到目前为止,我们只使用了带小数点的数字,比如 5.23.14。但你也可能用到不带小数点的数字,比如 53

这类数字称为整数,在 Kotlin 中整数类型简称 Int。以下是创建整数变量的示例:

val numberOfDogs: Int = 3

布尔值

有时你希望变量保存一个之类的值。

在这种情况下,你需要一个 Boolean 变量。

val earthIsRound: Boolean = true
val earthIsFlat: Boolean = false

为什么叫 Boolean

它以19世纪的英国数学家乔治·布尔(George Boole)的名字命名,他创建了一种用真值和假值(而非数字)来运算的代数分支。

很酷吧。

字符串

你也可以把文本存入变量。程序员对此有个花哨的词叫字符串(string),因为它是一串字符——如字母、数字和符号——被“串”在一起:

String of characters... with a string running through them. g n i r t s a s i s i h T

在 Kotlin 中,这种类型叫做 String,可以这样创建一个 String 变量:

val text: String = "This is a string"

其他类型

这些只是一些常见的变量类型。在本书中,我们将学习如何创建自己的类型————它们建立在我们刚刚介绍的这些基本类型之上。

类型与重新赋值

在 Kotlin 中,每个变量的类型在你编写代码时就已确定,且其类型永远不会改变(除非你重写代码)。这就是我们称之为静态类型的原因。一旦变量以某种类型声明,就不能再赋入其他类型的值。例如,若我们创建了一个 Int 类型的变量,就不能再将其重新赋值String

var numberOfDogs: Int = 5
numberOfDogs = "five"
Error

在后续章节中,我们将看到静态类型如何在变量重新赋值之外的更多场景中发挥作用,以及某些类型如何拥有子类型

不过我们有点超前了——现在让我们来总结这一章!

总结

在本章中,我们学习了:

  • 变量
    • 使用 var 声明可重新赋值的变量。
    • 使用 val 声明只读变量。
  • 表达式与语句
    • 表达式可以被求值为一个值。
    • 语句不会求值为一个值。
    • 你可以尝试将一段代码赋值给变量,来判断它是语句还是表达式。
  • 基本类型
    • 数字类型,如 DoubleInt
    • Boolean 类型,用于 truefalse 值。
    • String 类型,用于文本值。

现在我们对变量有了深入理解,是时候用令人兴奋的新方式将它们组合在一起了!请继续阅读第2章,我们将学习 Kotlin 中的函数

感谢 Matt McKennaJacob RakidzichDoug Smith 对本文的审阅。