前言
Google对Android技术不断更新,Android开发Kotlin已经成为主流语言。我们从Kotlin基础学起。这篇是Kotlin的基础知识基本数据类型:
整型
整型Kotlin提供了四种不同的类型:
类型 | 大小(比特数) | 最小值 | 最大值 |
---|---|---|---|
Byte | 8 | -128 | 127 |
Short | 16 | -32768 | 32768 |
Int | 32 | -2,147,483,648 | 2,147,483,648 |
Long | 64 | -9,223,372,036,854,775,808 | 9,223,372,036,854,775,808 |
bit(比特数)计算机内部最小数据存储单元。表示二进制位。 Byte(字节数)Byte计算机处理数据的基本单位。
1Byte = 8bit
1Short = 2Byte
1Int = 4Byte
1Long = 8Byte
浮点数
Float与Double类型。根据IEEE 754 标准,两种浮点类型的十进制位数不同(存储多少位十进制数)不同。Float单精度,Double是双精度。
类型 | 大小(比特数) | 有效数字比特数 | 指数比特数 | 十进制数 |
---|---|---|---|---|
Float | 32 | 24 | 8 | 6~7 |
Double | 64 | 53 | 11 | 15~16 |
小数初始化的变量,编译器会推断为Double类型。如果需要显式指定Float类型,添加f或者F后缀。如果值包含多于6~7位十进制,则舍入。
val a = 3.14 //Double
val b = 2.7182818283 //Double
val c = 2.7182818283f //Float 实际值为 2.7182817
字符
Char类型表示。声明字符字面值需要用英文单引号括起来。
val char='c'
特殊字符用反斜杠转义。\t \b \n \r ' " \ 与$。编码其他字符要用Unicode转义序列语法:'\uFF00'
val a = '\t' //水平制表(HT) 跳到下个TAB位置
val b = '\b' //退格(BS),将当前位置移到前一列
val n = '\n' //换行(LF),将当前位置移到下一行开头
val r = '\r' //回车(CR),将当前位置移到本行开头
val c = '\'' //代表一个单引号(撇号)字符
val c1 = '\"'//双引号字符
val c2 = '\'//反斜线字符
val c3 = '$'//美元符号。${}一般表示变量或者表达式
字符可以转换为整型或浮点型
val a = '0'.toInt()
val numFloat = '0'.toFloat()
布尔
用Boolean类型表示ture/false若需要可空引用布尔会被装箱。
val a:Boolean = false
内置布尔运算:
- || 短路逻辑或
- && 短路逻辑与
- !逻辑非
字面常量
- 二进制:0b00001011。以0B开头
- 八进制:kotlin目前不支持
- 十进制:通常以数字0,1,2,3,4,5,6,7,8,9表示,若声明Long类型用大写L标记 246L。
- 十六进制:0x0f 以数字0,1,2,3,4,5,6,7,8,9和字母A,B,C,D,E,F(a,b,c,d,e,f)表示。A-F表示10~15。
kotlin1.1起可以在数字前面添加下划线,使数字常量更易读。
val a = 123_123_123
val b = 0xFF_12_AB_5E
val c = 0b11010011_10010101
位运算
用中缀方式调用函数
val a = (1 shl 2) and 0x000FF001
位运算列表:
位运算符 | kotlin | java | |
---|---|---|---|
有符号左移 | shl(bits) | >> | |
有符号右移 | shr(bits) | << | |
无符号右移 | ushr(bits) | >>> | |
位与 | and(bits) | & | |
位或 | or(bits) | ||
位异或 | xor(bits) | ||
位非(取反运算符) | inv() | ~ |
装箱和拆箱
Java中的定义:装箱和拆箱是指发生在基本类型与包装类型之间的转换。
- 装箱:基础类型(int double等)转换成包装类型(Integer Double等)的过程。
- 拆箱:从包装类型转换到基础类型的过程。
int a = 1;
Integer b = a;// 拆箱
int c = b;// 装箱
Kotlin中只存在基本类型的装箱过程,并不存在拆箱。Kotlin中没有基本数据类型的包装类,Kotlin中都是对象。 声明某个类型是可空对象:
Int?
String?
ClassName?
val a:Int = 12
val b:Int= a //装箱的过程,装箱后值没有发生变化
显示转换
Kotlin中基本数据类型较小的类型并不是较大类型的子类,较小的类型并不能隐式的转换为较大的类型。
val a:Byte = 0
val b:Int = b.toInt()// 需要这样处理
在Kotlin中每个数字类型支持如下转换:
- toByte(): Byte
- toShort(): Short
- toInt(): Int
- toLong(): Long
- toFloat(): Float
- toDouble(): Double
- toChar(): Char
运算
Kotlin支持数字运算的标准集(+ - * / %),运算被定义为相应的类成员(编译器会将函数调用优化为相应的指令) 运算符重载。
整数除法
整数除法返回整数,丢弃任何小数部分。
val a = 5/2
// println(a == 2.4) // ERROR:Operator '==' cannot be applied to 'Int' and 'Double'
println(a == 2) // true
val b = 5L/2
println(b == 2L) // true
val c = 5/2.toDouble()
println(c == 2.5)// true
数组
Array类来表示,定义了get和set函数(按照运算符重载约定会转变为[])以及size属性。
public class Array<T> {
public inline constructor(size: Int, init: (Int) -> T)
public operator fun get(index: Int): T
public operator fun set(index: Int, value: T): Unit
public val size: Int
public operator fun iterator(): Iterator<T>
}
可以使用Array类自带的次构造函数,创建一个指定大小,每个元素都相同的数组。
// init是函数类型的参数
public inline constructor(size:Int,init:(Int)->T)
也可以使用Library.kt文件中的顶层函数,arrayOf(vararg:element T)来创建一个数组并传递元素值给它,这样arrayOf(1,2,3)创建了array[1,2,3].或者,库函数arrayOfNulls(size:Int)可以用于创建一个指定大小的,所有元素为空的数组。
val arr = Array(3){"a"}
arr.onEach { println(it) }//a a a
val array = arrayOf(1,2,3)
array.onEach { println(it) }//1 2 3
val nullArray = arrayOfNulls<Int>(2)
nullArray.onEach { println(it) }//null null
println(nullArray[0])// null
[]运算符代表调用成员函数get()
原生类型的数组
Kotlin有无装箱开销的专门的类来表示原生类型数组:ByteArray ShortArray IntArray 等。这些类与Array没有继承关系,它们有相同的方法属性集。它们都有相应的工厂方法:
val x:IntArray = intArrayOf(1,2,3)
x[0] = x[1]+x[2]
// 大小为5 值为[0,0,0,0,0]的整型数组
val arr = IntArray(5)
arr.onEach { println(it) }
// 大小为5,值为[2,2,2,2,2]的整型数组
val arr2 = IntArray(5){2}
// 大小为5,值为[0,1,2,3,4]
var arr3 = IntArray(5){it}(值初始化为其索引值)
arr3.onEach { println(it) }
字符串
Kotlin用String来表示字符串。字符串是不可变的。字符串中的元素 字符串可以使用索引运算符访问a[i]。可以用for循环迭代字符串:
val str = "kotlin"
for (a in str){
println(a)// kotlin
}
字符串字面值可以包含模板表达式,一小段代码,把结果合并到字符串中。模板表达式以美元符($)开头:
val str = "kotlin"
println("str = ${str.length}")// 6
总结
kotlin的基础知识与java可能有点差别,感觉更像js上面的语法,更加人性化。有了基础知识的支撑才能为以后Android开发或者从事kotlin相关语言开发做铺垫。