Kotlin学习之路(一):变量,常量,空安全

一.var变量和常见类型

1.1 变量和类型

kotlin的变量类型和Java的差不多,但是在写法上有很大的不同

        fun main() {
    
    
            var num:Int = 22
            println(num)
        }

var保留字放在最前面,用来表示num是一个变量,数据类型放在变量的后面,同时用:隔开,且没有;
变量类型和Java差不多,提供了Byte,Short,Int,Long,Float,Double,
Char,Boolean以及String至于每个类型的最大值和最小值,你可以使用每个数据类型(除了Boolean和String)的MAX_VALUEMIN_VALUE来获取。

1.2 智能推断

上面的代码如果在AndroidStudio上会有个警告Explicitly given type is redundant here ,IDE警告说"显式给定的类型在这里是多余的",IDE可以通过智能推断可以推出具体类型。
以下的代码可以编译通过:

        fun main() {
    
    
            var num = 22
            num = 2
            println(num)
        }

上面的代码数字改成33.4,”aaaa“,都可以编译通过,这都归功于智能推断。但是,这里有个值得注意的一点,变量初始化后,再重新赋其他类型的值是会报错的,比如下面代码:

        fun main() {
    
    
            var num = 2
            num = 223.44 // 报错
        }

二.常量

2.1 val常量

val被修饰后,初始化一次后,不能再次赋值。

        fun main() {
    
    
            val num = 2
            num =23 // 编译报错
        }

val常量初始化一次后,不能再次赋值。

2.2 const常量

const关键词是kotlin的特有的,java中没有此关键词。
const必须和val合用,只能用在companion objectobject和Top-level(顶级声明)里面。

const val num = 2

companion object {
    
    
	const val num = 2
}

object Test{
    
    
    const val num = 2
}

三.var变量,val常量,const的区别

如果需要了解该问题,最好的办法是反编译成Java代码
kotlin代码:

class Main {
    
    

    var variable = 2

    val constant = 2

    companion object{
    
    

        const val constVal = 2

        @JvmStatic
        fun main(args:Array<String>){
    
    

        }
    }
}

反编译后Java代码:

	// 代码省略...
	private int variable = 2; // var
    private final int constant = 2; // val
    public static final int constVal = 2; // const val

通过上面的反编译的代码可以很明确的看出来区别。
更加详细的关于var val const编译情况可以看这篇文章:
kotlin var,val,const val修饰符编译

四.空安全

4.1 ? 和 !!

可空类型只需要在类型后面加上?即可

		fun main(){
    
    
			// 可空类型
			// 这时候由String类型改为String?类型
			var str:String? = "aaa"
            println(str?.length) // 可空类型的调用
        }

可空类型的作用是在编译阶段就解决空指针异常,并且str?.length这种写法是可以保证线程安全的。
以下是对比代码:

        fun main(){
    
    
            // 第一种
            var str0:String = null // 直接编译出错
            println(str0.length)
			
			// 第二种,编译和运行正常
			var str0:String? = null // String类型改为String?类型
    		println(str0?.length) // 不会调用length,打印null
        }

如果你希望kotlin代码遇到空指针的时候能够抛出异常,你可以使用!!

        fun main(){
    
    
            var str:String? = "aaa"
            println(str!!.length) // 如果str为null,这里会抛异常
        }

4.2 ?:

在使用?的时候可能会出现一些意想不到的问题,比如下面的代码:

        fun main(){
    
    
            var num:Int? = 2
            if (num > 0){
    
    // 编译失败
                println("小于0")
            }
        }

如上代码所示,这种情况无法编译,那么如何解决这个问题呢?这就可以用?:来解决。

        fun main(){
    
    
            var num:Int? = 2
            if (num?:-1 > 0){
    
    
                println("小于0")
            }
        }

变量0?:变量1的作用,如果变量0为null,那么则取变量1的值。如果变量0不为null,则取变量0的值。

四.总结

以上的内容就是关于kotlin的val,var,const val,?,!!,以及变量类型的用法和总结。

猜你喜欢

转载自blog.csdn.net/RQ997832/article/details/122710233