Kotlin对于万物皆对象的阐述更加全面,没有像Java中那样的原始基本类型。
1、基本类型
当然,想整形、浮点、布尔值这些类型仍然存在,但是它们全部都会作为对象存在。需要在使用的时候注意以下几点:
- 数字类型不会自动转型。
val i:Int=7
val d: Double = i.toDouble() - 字符Char不能直接作为数字处理
val c:Char='c'
val i: Int = c.toInt() - 位运算的写法不同
val bitwiseOr = FLAG1 or FLAG2
val bitwiseAnd = FLAG1 and FLAG2 - 编译器自己推断具体的类型
val i = 12 // An Int
val iHex = 0x0f // 一个十六进制的Int类型
val l = 3L // A Long
val d = 3.5 // A Double
val f = 3.5F // A Float - String可以像数组那样访问,并且被迭代
- val s = "Example"
val c = s[2] // 这是一个字符'a'
// 迭代String
val s = "Example"
for(c in s){
print(c)
}
2、变量
变量可以简单地定义成可变var和不可变val的变量。不可变在Kotlin中是一个很重要的概念。
一个不可变对象意味着它在实例化之后就不能再去改变它的状态了。如果你需要一个这个对象修改之后的版本,就需要去创建一个新对象。相比Java来说,这样使得编程更加具有健壮性和预估性。而非任何可以访问这个对象的代码都可以去修改它,从而影响整个程序的其他地方。
不可变对象也可以说是线程安全的。总而言之,尽可能地使用val。
通常我们不需要像Java那样去指明类的类型,它会自动从后面分配的语句中推断。
val s = "Example" // A String
val i = 23 // An Int
3、属性
在Kotlin中不需要setter和getter方法。
var默认有set和get方法,而val默认有get方法。默认是open状态,如果你不希望你声明的var变量被随意地修改变量,可以这样改。
var setterVisibility: String = "abc" private set // the setter is private and has the default implementation
var setterWithAnnotation: Any? = null @Inject set // annotate the setter with Inject
关于field关键字
var test = 0
set(value) {
if (value >= 0) field = value
}
test = -1,结果test的值是0
test = 1,结果test的值是1
4、编译时常量
使用const关键字标记,必须是Top-level或者某个object的成员,必须初始化
object ConstantsK {
const val TEST_NAME: Int = 0
}
const val TEST_NAME1: String = "aaaa"
5、延迟初始化
在kotlin中,编译器会强制要求你对变量初始化,没有初始化的变量不能通过编译。但是我们有时候并不想要一开始就初始化,那么有没有解决的方式呢?有的,lateinit
6、对于空指针的处理
val testNull: String = null
首先这种写法是有问题的,编译器会提示你不能给非null的类型赋null值。那么如果你想要编译通过,并且还要赋null值,要这么写呢?
val testNull: String? = null
好了那么现在你想要测试空指针异常,按照Java的写法,我们会写
testNull.length
但是不好意思,编译器又报错了,只有?.或者!!可以这样调用。
testNull!!.length 调用结果空指针异常,可见双!是为了警告开发者,你这个变量一定要是非null。
testNull?.length 调用结果null,但没有异常,可见?对可能为null的变量调用时候的安全方式。
7、接口中的变量
众所周知,在Java中interface可以声明一个final变量,但是必须要赋初值。而在kotlin中,你可以声明一个val变量,但不需要赋初值,在实现接口的地方赋值。
override val testBool: Boolean
get() = TODO("not implemented")