目录:Kotlin中的基础类型
- 变量
1、分隔符
(1)分号:与Java不同,Kotlin并不强制要求每条语句必须以分号结尾。
(2)花括号、方括号、圆括号、空格:与Java类似。
(3)圆点:通常用作类、结构体、枚举、实例和它的成员(包括属性和方法)之间的分隔符,表明调用某个类或某个实例的指定成员。
2、标识符规则与Java类似
3、一些特殊的关键字
as:用于做类型转换或为import 语句指定别名。
as?:类型安全的类型转换运算符。
fun:声明函数。
in 与 !in:在for 循环中使用; in 还可作为双目运算符,检查一个值是否处于区间或集合内;in 也可在when 表达式中使用; in 还可用于修饰泛型参数,表明该泛型参数支持逆变。
is 与 !is:用于做类型检查(类似Java 的instanceof) 或在when 表达式中使用。
typealias:用于定义类型别名。
val:声明只读属性或变量。
var:声明可变属性或变量。
when:用于when 表达式。
by:用于将接口或祖先类的实现代理给其他对象。
delegate:用于指定该注解修饰委托属性存储其委托实例的字段。
dynamic:主要用于在Kotlin/JavaScript中引用一个动态类型。
field:用于指定该注解修饰属性的幕后字段。
file:用于指定该注解修饰该源文件本身。
init:用于声明初始化块。
param:用于指定该注解修饰构造器参数。
property:用于指定该注解修饰整个属性(这种目标的注解对Java 不可见,因为Java并没有真正的属性)。
receiveris:用于指定该注解修饰扩展方法或扩展属性的接收者。
set:用于声明属性的setter方法,或者用于指定该注解修饰属性的setter方法。
setparam:用于指定该注解修饰setter方法的参数。
get:用于声明属性的getter 方法,或者用于指定该注解修饰属性的getter方法。
where:用于为泛型参数增加限制。
companion:用于声明一个伴生对象。
lateinit:用于修饰一个non-null 属性,用于指定该属性可在构造器以外的地方完成初始化。
open:用于修饰类,表示该类可派生子类;或者用于修饰成员,表示该成员可以被重写。
sealed:用于声明一个密封类。
suspend:用于标识一个函数后Lambda表达式可作为暂停。
vararg:用于修饰形参,表明该参数是个数可变的形参。
4、声明变量
Kotlin是强类型的语言,Kotlin要求所有的变量必须先声明、后使用,声明变量时必须显式或隐式指定变量的类型,类型限制了一个变量能被赋的值,也限制了一个表达式可以产生的值,还限制了在这些值上可以进行的操作,井确定了这些操作的含义。
var|val 变量名 [:类型] [=初始值]
—— 其中,var声明的变量是值可变的(可被多次赋值),使用val声明的变量是值不可变的(不能被重新赋值〉
如:
var b: Int = 5
var name = "rookie"
需要注意的是,程序要么通过“:类型”的形式显式指定该变量的类型,要么为该变量指定初始值一-Kotlin编译器将会根据该初始值确定变量的类型,不能声明变量时既不指定变量类型,也不指定变量初始值。
- 数值型
1、整型
Byte:-128~127,兼容Java 的byte和Byte类型。
Short:-32768(-2的15次方)~32767(2的15次方-1 ),兼容Java的short和Short 类型。
Int:-2147483648(-2的31次方 )~2147483647(2的31次方-1 ),兼容Java的int和Integer类型。未指定类型时,Kotlin会自动判断该变量类型为Int。
Long:(-2的63次方 )~(2的63次方-1 ),兼容Java的long和Long类型。
注意:Kotlin语言允许在己有数据类型后添加“?”,添加“?”后的数据类型相当于对原有类型进行了扩展,带“?”的数据类型可支持被赋予null 值。
同时,不带“?”普通类型的整型变量将会映射成Java 的基本类型,如int;而带“?”后缀的整型变量将会映射成基本类型的包装类,如Integer。
// Int 型变量不支持null 值,所以下面代码是错误的
var notNull: Int = null
// Int ?相当于支持null 值的Int 型,所以下面代码是正确的
var nullable : Int? = null
为了提高可读性,Kotlin允许在数值中增加下划线,或者在前面添加额外的零。
val oneMillion = 0000100_0000
2、浮点型
Kotlin的浮点类型与Java相似,包含Float和Double两种。
3、字符型
Kotlin中,字符型必须使用单引号(’)括起来,但是与Java不同的是,Kotlin的Char变量不能当成整型使用,两种类型之间是不能相互转换的。
4、数值型之间的转换
需要特别注意的是,Kotlin是一门强类型语言,是不支持低精度数据直接隐式转换为转换为高精度类型,所涉及到的类型转换必须显式调用toXXX()方法。
但是在Kotlin的表达式当中是支持自动类型转换的,但这种转换是基于上下文推断出来的,而且算术运算会有重载做适当转换。
- 布尔类型
Kotlin中的布尔类型与Java中相似。
- null安全
NPE是一个老生常谈的问题,可以说是对Java的重大改进之一。
只有可空类型的变量或常量才能接受null,非空类型则不能接收null,通过在基本数据类型后添加“?”来区分是否可空。
可空类型的变量不允许直接调用方法或属性,但可以先判断该变量不为null ,然后再调用该变量的方法或属性。
Kotlin可以实现安全调用,并支持链式调用。主要使用“?.”。
fun main() {
var test: String? = "rookie"
print(test?.length)
// 此时输出 6
test = null
print(test?.length)
// 此时输出 null
}
Kotlin中还支持Elvis运算简化if-else方法。
fun main() {
var test: String? = "rookie"
var t1 = if (test != null) test.length else -1
var t2 = test?.length ?: -1
// 两种方式是等价的
}
此外,Kotlin还支持强制调用。强制调用是为NPE “ 爱好者”准备的一一不管变量是否为null ,程序都直接调用该变量的方法或属性。Kotlin 也为这种用法提供了支持,用“ !!."可强制调用可空变量的方法或属性,但是这可能会引发NPE。
- 字符串类型
Kotlin中的字符串有两种字面值。一个是转义字符串,它是可以包含转义字符的,这点很像Java的字符串;另外一个原始字符串,可以包含换行符或者其他任意文本,比较特殊的是需要用三引号括起来。
Kotlin 允许在字符串中嵌入变量或表达式,只要将变量或表达式放入 ${}。这样Kotlin将会把该变量或表达式的值嵌入该字符串中。
此外,Kotlin也像Java一样提供了很多便捷的方法,使用时查阅相关资料即可。
- 类型别名
Kotlin提供了类似于C 语言中的typedef的功能: 可以为己有的类型指定另一个可读性强的名字。如:
//为A.Inner 内部类指定别名
typealias AInner =A.Inner
//为B.Inner 内部类指定别名
typealias BInner = B.Inner