Kotlin学习(一)——函数、常量与变量、数据类型
一、函数
Kotlin中,使用关键字fun来申明函数,fun 后面紧跟着的是函数名,函数形式参数,返回值,函数体
例如:
函数名:sun
形参:有a、b两个,都是Int类型,
返回值:以:申明后面跟着的是具体的返回值类型,如需要返回无意义的值(java的void)时可以不写或者用Unit<br />
fun sum(a: Int, b: Int): Int {
return a + b
}
无返回值
fun printSum(a: Int, b: Int):Unit {
println("sum of $a and $b is ${a + b}")
}
或者不写Unit
fun printSum(a: Int, b: Int):Unit {
println("sum of $a and $b is ${a + b}")
}
<br />
Main函数
fun main(args: Array<String>) {
println("hello world");//在kotlin中,对;结束标识符没有作严格要求,可写可不写,println是kotlin种的打印语句相当于java的System.out.println
}
二、常量与变量
kotlin中常量和变量的定义分别用val、var来定义,定义常量和变量分别有以下几种形式:
常量的定义(使用val关键字)
val a: Int = 1 // 立即赋值
val b = 2 // 自动推断出 `Int` 类型
val c: Int // 如果没有初始值类型不能省略
c = 3 // 明确赋值
变量的定义(使用var关键字)
var x = 5 // 自动推断出 `Int` 类型
x += 1
三、数据类型
在 Kotlin 中,所有东西都是对象,在这个意义上讲所以我们可以在任何变量上调用成员函数和属性。有些类型是内置的,因为他们的实现是优化过的。但是用户看起来他们就像普通的类。本节我们会描述大多数这些类型:数字、字符、布尔和数组。<br />
1.数字类型
Kotlin 提供了6种类型来表示数字(与 Java 很相近):Double、Float、Long、Int、Short、Byte<br />
注意在 Kotlin 中字符不是数字<br />
kotlin中数字类型的字面值有个特性,就是支持下划线使得数字更有阅读性(从kotlin以后1.1)<br />
例如:
val oneMillion = 1_000_000
val creditCardNumber = 1234_5678_9012_3456L
val socialSecurityNumber = 999_99_9999L
val hexBytes = 0xFF_EC_DE_5E
val bytes = 0b11010010_01101001_10010100_10010010
值常量字面值有以下几种:
十进制: 123<br />
Long 类型用大写 L 标记: 123L<br />
十六进制: 0x0F<br />
二进制: 0b00001011<br />
注意: 不支持八进制<br />
Kotlin 同样支持浮点数的常规表示方法:<br />
默认 double:123.5、123.5e10<br />
Float 用 f 或者 F 标记: 123.5f<br />
2.类型转换
-
隐式转换,不需要书写格外代码,由系统自动实现类型转换,Kotlin中如果定义变量明确指定了数字类型,那么就不能进行隐式转换了,如下面的代码就不被支持
val a: Int? = 1 // 一个装箱的 Int (java.lang.Integer) val b: Long? = a // 隐式转换产生一个装箱的 Long (java.lang.Long) 正确的转换代码: val a:Int? = 1 val b:Long? = a.toLong
-
显示转换,需要使用格外的代码,如需要把一个Int类型转换成Long类型,需要使用Int.toLong
每个数字类型支持如下的转换: toByte(): Byte toShort(): Short toInt(): Int toLong(): Long toFloat(): Float toDouble(): Double toChar(): Char
3.布尔
布尔用 Boolean 类型表示,它有两个值:true 和 false。
若需要可空引用布尔会被装箱。
内置的布尔运算有:
|| – 短路逻辑或
&& – 短路逻辑与
! - 逻辑非
4.数组
数组在 Kotlin 中使用 Array 类来表示,它定义了 get 和 set 函数(按照运算符重载约定这会转变为 [])和size 属性,以及一些其他有用的成员函数:
class Array<T> private constructor() {
val size: Intoperator fun get(index: Int): Toperator fun set(index: Int, value: T): Unitoperator fun iterator(): Iterator<T>// ……
}
我们可以使用库函数 arrayOf() 来创建一个数组并传递元素值给它,这样 arrayOf(1, 2, 3) 创建了 array [1, 2, 3]。 或者,库函数 arrayOfNulls() 可以用于创建一个指定大小、元素都为空的数组。
另一个选项是用接受数组大小和一个函数参数的工厂函数,用作参数的函数能够返回 给定索引的每个元素初始值:
Kotlin 也有无装箱开销的专门的类来表示原生类型数组: ByteArray、 ShortArray、IntArray 等等。这些类和 Array 并没有继承关系,但是 它们有同样的方法属性集。它们也都有相应的工厂方法:
val x: IntArray = intArrayOf(1, 2, 3)
x[0] = x[1] + x[2]
数组的使用Demo
fun testArray() {
//数组的定义
var arrays: Array<Int> = arrayOf(12, 21, 33, 44, 55);//定义一个Int类型数组,直接赋值
var arrays2: Array<Int?> = arrayOfNulls<Int>(arrays.size)//定义一个长度和arrays一样的空数组,后赋值
//遍历arrays数组,并且给arrays赋值
for (c in 0..arrays.size-1){
println("arrays的值遍历:${arrays[c]}");
arrays2.set(c,arrays.get(c)+1)
}
//遍历arrays2数组
for (c in arrays2) {
println("arrays2:$c ");
}
}
5.字符串
字符串用 String 类型表示。字符串是不可变的。 字符串的元素——字符可以使用索引运算符访问: s[i]。 可以用 for 循环迭代字符串:
for (c in str) {
println(c)
}
字符串字面值<br />
Kotlin 有两种类型的字符串字面值: 转义字符串可以有转义字符,以及原生字符串可以包含换行和任意文本。转义字符串很像 Java 字符串:
val s = "Hello, world!\n";//转义采用传统的反斜杠方式
原生字符串 使用三个引号(""")分界符括起来,内部没有转义并且可以包含换行和任何其他字符:
val text = """
for (c in "foo")
print(c)"""
也可以类似Java中通过 trimMargin() 函数去除前导空格:
val text = """|Tell me and I forget.|Teach me and I remember.|Involve me and I learn.|(Benjamin Franklin)""".trimMargin()
默认 | 用作边界前缀,也可以选择其他字符并作为参数传入,比如 trimMargin(">")。
6.字符串模板
字符串可以包含模板表达式 ,即一些小段代码,会求值并把结果合并到字符串中。 模板表达式以美元符($)开头,由一个简单的名字构成:
val i = 10
val s = "i = $i" // 求值结果为 "i = 10"