Kotlin学习总结:Kotlin基础(一)

Kotlin学习总结:Kotlin基础(一)

在这一部分学习了Kotlin的基本要素:变量、函数和类,顺便熟悉Kotlin的属性概念。

基本要素:函数和变量

  • 关键字fun用来声明一个函数。
  • 参数的类型写在它的名称后面。
  • 函数可以定义在文件的最外层,不需要把它放在类中
  • 数组就是类。和Java不同,Kotlin没有声明数组类型的特殊语法。
  • 使用println代替了System.out.println。Kotlin标准库给Java标准库函数提供了许多语言更简洁的包装,而println就是其中一个。
  • 和许多其他现代语言一样,可以省略每行代码结尾的分号。

函数

函数的声明以关键字fun开始,函数名称紧随其后:例子中函数名称是max。接下来是括号起来的参数列表。参数列表的后面跟着返回类型,它们之间用一个冒号(:)隔开。
在Kotlin中if是有结果值的表达式。它和Java中的三元运算符相似:(a>b)?a:b

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

语句和表达式

在Kotlin中,if是表达式,而不是语句。语句和表达式的区别在于,表达式有值,并且能作为另一个表达式的一部分使用;而语句总是包围着它的代码块中的顶层元素,并且没有自己的值。在Java中,所有的控制结构都是语句。而在Kotlin中,除了循环(for、while和do/while)以外大多数控制结构都是表达式。
另一方面,Java中的赋值操作是表达式,在Kotlin中反而变成了语句。

表达式函数体

让前面的函数体变得更简单。因为它的函数体是由单个表达式构成,可以用这个表达式作为完整的函数体,去掉花括号和return语句:

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

如果函数体写在花括号({})中,我们说这个函数有代码块体。如果它直接返回了一个表达式,它就有表达式体

Intellij IEDA提供了在两种函数风格之间转换的intention actions(意向动作):“Convert to expression body”(转换成表达式函数体)和"Convert to block body"(转换成代码块函数体)。
对表达式体函数来说,编译器会分析作为函数体的表达式,并把它的类型作为函数的返回类型,即使没有显式地写出来。这种分析通常被称作类型推导
进一步简化max函数,省掉返回类型:

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

注意,只有表达式体函数地返回类型可以省略。对于有返回值的代码块体函数,必须显式地写出返回类型和return语句。

变量

Kotlin中以关键字开始,然后是变量名称,最后加上类型(不加也可以)。

val question = "The Ultimate Question of Life, the Universe, and Everything"
val answer = 42
val answer: Int = 42

和表达式函数一样,如果不指定变量地类型,编译器会分析初始化器表达式的值,并把它的类型作为变量的类型。
如果变量没有初始化器,需要显示地指定它的类型:

val answer: Int
answer = 42
可变变量和不可变量
  • val(来自value)——不可变引用。使用val声明的变量不能在初始化之后再次赋值。它对应的是Java的final变量。
  • var(来自variable)——可变引用。这种变量的值可以被改变。这种声明对应的是普通(非final)的Java变量。
    默认情况下,应该极可能地使用val关键字来声明所有地Kotlin变量,仅在必要地时候换成var。
    在定义了val变量地代码块执行期间,val变量只能进行唯一一次初始化。但是如果编译器确保只有唯一一条初始化语句会被执行,可以根据条件使用不同的值来初始化它:
val message: String
if (canPerformOperation)){
	mesaage = "Success"
} else {
	message = "Failed"
}

注意,尽管val引用自身是不可变地,但是它指向地对象可能是可变地。例如:

val languages = arrayListOf("Java")	// 声明不可变引用
languages.add("Kotlin")				// 改变引用指向地对象

即使var关键字允许变量改变自己的值,但它的类型却是改变不了的。例如:

var answer = 42
answer = "no answer"	// 错误:类型不匹配

如果需要在变量中存储不匹配类型的值,必须手动改把值转换或强制转换到正确的类型

更简单的字符串格式化:字符串模板

fun main(args: Array<String>){
	val name = if (args.size > 0) args[0] else "Kotlin"
	println("Hello, $name!")	// 打印的是"Hello, Kotlin",如果你把"Bob"作为实参传进来,打印的就是"Hello, Bob"
}

和许多脚本语言一样,Kotlin让你可以在字符串字面值中引用布局变量,只需要在变量名称前面加上字符$。这等价于Java中的字符串连接(“Hello, " + name + “!”),效率一样但是更紧凑(编译后的代码创建了一个StringBuilder对象,并把常量部分和变量附加上去)。当然表达式会进行静态检查,如果试着引用一个不存在的变量,代码根本不会编译。
如果要在字符串中使用$字符,要对它转义:println(”\$")
还可以引用更复杂的表达式,而不是仅限于简单的变量名称,只需要把表达式用花括号括起来:

fun main(args: Array<String>) {
	if (args.size > 0) {
		println("Hello, ${args[0]!"})	// 使用${}的语法插入args数组中的第一个元素
	}
}

还可以在双引号中直接嵌套双引号,只要它们处在某个表达式的范围内(即花括号内):

fun main(args: Array<String>) {
	println("Hello, ${if (args.size > 0) args[0] else "someone"}!)
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值