变量和属性

来源:互联网 发布:电视机32寸淘宝网 编辑:程序博客网 时间:2024/05/22 03:51
Kotlin对于万物皆对象的阐述更加全面,没有像Java中那样的原始基本类型。

1、基本类型

当然,想整形、浮点、布尔值这些类型仍然存在,但是它们全部都会作为对象存在。需要在使用的时候注意以下几点:
  • 数字类型不会自动转型。
    val i:Int=7
    val dDouble = i.toDouble()
  • 字符Char不能直接作为数字处理
    val c:Char='c'
    val iInt = c.toInt()
  • 位运算的写法不同
    val bitwiseOr = FLAG1 or FLAG2
    val bitwiseAnd = FLAG1 and FLAG2
  • 编译器自己推断具体的类型
    val i = 12 // An Int
    val iHex = 0x0f // 一个十六进制的Int类型
    val l = 3// A Long
    val d = 3.5 // A Double
    val f = 3.5// 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变量被随意地修改变量,可以这样改。

varsetterVisibility:String = "abc" privateset// the setter is private and has the default implementation

varsetterWithAnnotation:Any?= null  @Inject set // annotate the setter with Inject

关于field关键字
var test 0
   set(value) {
        if (value >= 0field = 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")
原创粉丝点击