美文网首页
Kotlin学习2

Kotlin学习2

作者: 思思入扣 | 来源:发表于2019-06-24 16:06 被阅读0次

    1.Kotlin中static
    在kotlin中 没有static关键字,但是有类似java中static的用法
    例如:启动一个Activity的时候,就可以在本activity页面这样写,在启动页面之间启动

    //HomeActivity中这样写
    companion object {
            fun launch(context: Activity){
                val intent= Intent(context,HomeActivity::class.java)
                context.startActivity(intent)
                context.finish()
            }
        }
    
    
    //启动的activity直接调用
    HomeActivity.launch(this@SplashActivity)
    
    1. ? ?. as? !!
      (1) ?可空类型
      kotlin和Java的类型系统之间的一个很重要的区别就是,Kotlin对可空类型的显示支持
      也就是说你可以声明一个变量,并且使用可空类型?来表示这个变量是可以为null的
      例如:
      java:
      这个函数并不安全,原因是传入的参数s如果是null,就会报空指针异常
    int StrLen(String s){return s.length}
    

    kotlin:

    fun StrLen(s:String?):Int = s.length //不能直接调用length方法
    //1、这里使用了可空类型?,?可以加载任何类型的后面来表示这个类型的变量可以为null
    //2、可空类型的变量在使用的时候不能直接调用它的方法
    //3、也不能把可空类型的值传给非空类型
    /**
    *如 val x:String?=null  var y:String = x//把可空类型的x赋值给非空类型的y会报错:Type mismatch
    *同样也不能把一个可控类型的值传给拥有非空类型参数的函数如StrLen(x) 传给  StrLen(x:String)
    **/
    

    (2) ?. 安全调用运算符

    fun StrLen(s:String?):Int = s.length  //不能直接调用length方法
    //如果增加了null检查以后,就可以直接调用s.length了,如下:
    fun StrLen(s:String?):Int  = if(s!=null) s.length else 0
    //但是如果每个可空类型都这样检查会显得特别累赘,此时就用到了安全调用运算符?.
    
    s?.length 就相当于 if(s!=null) s.length else null
    //如果s不为空就执行方法,如果为空就返回null
    

    (3) ?: Elvis运算符(null合并运算符)
    使用?:运算符可以设置当检查结果为空的时候的返回值

    fun foo(s:String?){
         val t:String  =  s ?:  "" //如果?:左边的值不为空返回左边的值,如果为空返回""
    }
    
    //可以这样使用
    a?. peroson?. name ?: "UnKnown" //如果?:左边为空则返回"UnKnown"
    //和throw运算符同事使用
    //如果不为空就返回name,如果为空就抛出一个有意义的错误,而不是NullPointException
    val name = a?.person?.name ?: throw illegalargumentexception("UnKnown name")//如果name为空就会报自定义的异常,防止下面代码调用而直接报空指针异常
    println(name.length)//如果name为空就会报空指针异常
    

    (4) as? 安全转换运算符
    尝试把值转换成给定的类型,如果类型不合适就返回null

                 -> foo !is Type  return null
    
    //as?和?:联合使用
    object as? Person ?: "not human"
    object as? Person ?: return false
    

    (5) !! 非空断言
    Kotlin不推荐使用非空断言,通常我们会用?:来防止程序运行时报空指针异常而崩溃
    如果值为null就抛出NullPointerException空指针异常

    var s:String = s!!  //如果s为null则会抛出空指针异常,并且异常会指向使用!!的这一行
    println(s)//如果s为null则会抛出空指针异常
    //使用断!!可以很方便的在抛出空指针异常的时候定位到异常的变量的位置
    //但是千万不要连续使用断言!!
    //student!!.person!!.name//如果报空指针异常了则无法判断到底是student为空还是person为空,所以不要连续使用断言!!
    

    (6) let函数和?.同时使用来处理可空表达式
    let函数只有左侧表达式不为空的时候才会调用

    person?.let{ //内部的it一定是非空的 }
    //如果person为空就不会调用let函数
    //如果person不为空才会调用let函数,所以?.和let函数配合使用可以很方便的处理可空表达式
    person?.let { println(it.name) //输出name}
    

    参考:
    https://blog.csdn.net/baidu_31093133/article/details/81434181

    相关文章

      网友评论

          本文标题:Kotlin学习2

          本文链接:https://www.haomeiwen.com/subject/zyxhfctx.html