美文网首页
Kotlin学习笔记

Kotlin学习笔记

作者: 蜂巢电影院 | 来源:发表于2017-12-17 12:49 被阅读0次

    Kotlin学习笔记

    前言

    ​ 今年听闻Google在I/O开发者大会上宣布,将Kotlin语言作为Android开发的一级编程语言,意味着在开发Android这块,迟早会取代Java,只是时间问题,两天的使用感受来看,语法上确实比Java简洁许多,能很程度上避免空指针问题,在方法与变量定义上更加灵活,刚接触会有点不习惯,但只要习惯了你会不觉爱上它。

    基本数据类型

    ​ 在数据类型这点上与java类似,常用的有Int,Float,Long,Double,Boolean等,需要注意的是名称上与java的有细微区别首字母大写。声明时名称与类型用:分开,名称在左,类型在右,也可以不指定类型,会自动识别。

    变量声明

    Kotlin在变量声明上大致有两种方式:var和val

    var

    代表值可变,类似java成员变量,声明时必须初始化,否则编译不通过,但也可以添加lateinit关键字指定该变量延迟初始化。

    var a:Int = 0 //显示指定类型
    var b = 0 //不指定类型,由值决定
    

    如果该变量可能为空需要使用?符号指定

    var a:Int? = 0 // ?表明该值可为空
    

    使用lateinit关键字修饰变量

    lateinit var a:String //声明后无需初始化,使用时再初始化
    

    注意:使用lateinit修饰变量时必须指定类型,而且对数据类型有要求,无法指定常用的Int/Float/Long/Double,只能指定String或自定义类。在新版本1.2中增加了判断变量是否初始化方法如下

    this:a.isInitialized //返回Boolean
    
    val

    代表值不可变,类似java中的final声明的变量。

    val a:String="test"
    val b ="test"
    
    方法声明及类、接口定义

    定义一个类或接口甚至抽象类与java一样,使用class,interface,abstract修饰。

    关于访问性

    如果需要继承一个class并重载某些方法,那么父类该方法的访问修饰符必须显式指定为open(默认为public),否则只能调用,无法重载。如果想指定某些方法禁止子类访问直接在方法声明处使用private修饰。

    • 方法声明

    Kotlin中方法声明使用fun关键字,方法可见性默认为public,可选修饰符有private/protected/open等

    //声明一个无参方法
    fun method1(){
    }
    
    //声明一个有参方法
    fun method2(params:String){
    }
    
    //声明一个有参方法,并带返回值
    fun method3(params:String):String{
    }
    
    //使用?指定该方法可以接收null类型,否则外部调用者无法传递null类型
    fun method4(params:String?){
    }
    
    • 类和接口定义
      • class
      class test {
        
        //不带返回值
        fun method1(){}
        
        //返回Int
        fun method2() :Int {return 0}
      }
      
      • interface
      interface test{
        
        //无返回值
        fun method()
        
        //返回String 类型
        fun method():String
      }
      
      • abstract
      abstract class {
        
        //子类必须实现
        abstract fun method1()
        
        //子类可访问,不可重载
        fun method2(){}
        
        //子类可选择是否重载
        open fun method3(){}
      }
      
    继承和实现

    ​ kotlin中继承一个class 和 实现一个接口都是用":"表示

    //定义一个类
    class A{
    }
    
    //继承自 A,注意,A()表明调用父类主构造方法
    class B:A(){}
    //另一种写法
    class B :A{
      constructor(){}
    }
    
    //定义一个接口
    interface A{
      
      //定义一个方法
      fun method()
    }
    
    //实现一个接口,并实现其方法(接口类型无需调用父类构造方法)
    class B:A{
      
      //实现自父类method方法
      override fun method(){
      }
    }
    
    构造方法

    ​ 声明class时默认含有一个隐式构造方法,当继承一个class则必须显式调用父类主构造方法。

    //无需指定空构造方法
    class TestA{
    }
    
    //带参构造方法,继承自TestA必须显式调用父类空构造方法 TestA()
    class TestB(params:String):TestA(){
    }
    
    //带参构造方法另一种写法
    class TestC{
      constructor(params:String){
      }
    }
    
    //继承自TestC 并重载基构造方法
    class TestD(params:String):TestC(params){
    }
    
    //也可以这样写
    class TestD:TestC{
    
        //重载父类构造方法(此时调用当前类的两个参数的构造方法)
      constructor(params:String):this(params,null){
      }
      
      //构造方法必须显式调用父类主构造方法(如果参数可为空,则必须用?指定)
      constructor(params1:String,params2:String?):super(params1){
      }
    }
    
    单例模式/常量类声明及静态方法

    ​ kotlin中创建一个单例模式非常简单,只需要使用object声明即可,而非class,且无需考虑线程安全问题。如果有些初始化操作,可以重写默认init方法。该方法只会在类创建时调用。

    ​ 对于常量类使用也是类似。

    //创建一个单例
    object Singleton{
      
      //初始操作
      init{
        //do something
      }
      
      fun method(){}
    }
    
    //外部调用示例
    class Test{ 
      fun mehtod(){
        
        //调用单例类Singleton中method方法
        Singleton.method()
      }
    }
    
    

    ​ 创建一个常量类与单例基本相同都使用object声明

    object Contants{
      val TEST:String = "test"
    }
    

    ​ 普通类中定义静态方法或属性

    class Test{
      //普通变量
      var test:Int = 0
      
      //声明一个伴生对象,定义静态变量及方法(注意:一个类只能声明一个伴生对象,并且伴生对象只能声明在class或interface中,object中无法再声明伴生对象)
      companion object {
            //静态变量
             val params:Int = 0
        
            //定义一个静态方法,返回当前类实例(不含方法体)
             fun instance:Test = Test()
        
            //返回默认值(不含方法体)
             fun method1():String = "abc"
        
            //指定方法返回类型,则必须有返回值(功能同上)
             fun method2():String{
                return "abc"
             }
        
            //不指定方法返回类型,必须有方法体
             fun method3(){
            }
        }
    }
    
    对象空安全处理

    ​ 在平常开发中很常见的一个场景就是,页面绑定一个数据模型类,而这个类的属性值需要跟后台返回,此时不可以避免接口出现异常情况,或网络出现异常,而导致该数据模型类为空,在使用该对象时稍有不慎就可能出现空指针导致程序崩溃,可以说是非常严重的问题,kotlin一大特点就是对空安全处理上,可以说是非常巧妙的避免了类似java中的空指针异常情况,但不是完全避免,如果使用特殊修饰符,也有可能出现空指针异常。

    //定义数据模型类
    class TestA{
      //声明一个可为空的变量,具体值依赖后台返回
      var params1:String?=null
    }
    
    class TestB{
      //声明数据模型对象mTestA,初始化为空
      var mObject1:TestA?=null
      //声明一个可延迟初始化数据模型对象mTestA2,依赖后台返回具体值再进行初始化操作
      lateinit var mObject2:TestA
      
      fun method(){
      
        //此时如果在java中是可以直接调用mObject1的属性的,这是非常危险的操作,而在kotlin中如果指定了对象初始化为空,像下面这种直接调用方式是不允许的
        mObject1.params1
        
        //推荐调用方式(此种调用方式,会在执行时检查对象是否为空,如果为空则不再继续执行,有效避免空指针发生)
        mObject1?.params1
        
        //kotlin中的危险操作(!!代表忽略检查对象为空情况,此时如果mObject1为空,也会抛出空指针异常)
        mObject1!!.params1
        
        //而对于使用mObject2,因为此对象使用了lateinit修饰,表明该对象为延迟初始化,所以kotlin中是允许直接调用的,因此使用时需要更加小心,以下调用方式也会直接抛出空指针异常
        mObject2.params1
        
        //对于使用lateinit修饰的对象安全的调用方式,类似java中的非空判断(注意:此方法在kotlin1.2.10中才有提供)
        if(this::mObject2.isInitialized){
          mObject2.params1
        }
      }
    }
    
    小结

    ​ 通过以上示例代码可以看出,在简洁性上面对比java还是有很大优势的,而且在安全上也能有效避免异常发生,但不是完全避免,特殊情况还是要注意。当前kotlin版本已经更新到1.2,基本不需要担心稳定性问题了,而且是Google推荐的Android首要开发语言,因此感兴趣的同学完全可以基本kotlin来进行开发了,目前新版本的AndroidStudio也提供了方便的Convert Java File to Kotlin File功能,可以快速实现java类到kotlin的转换,但对于java类中含有构造方法的情况,支持还不太友好,需要手动改造。个人的一点学习感悟,希望能帮到正在学习的你。

    学习地址

    kotlin中文文档:https://www.kotlincn.net/docs/reference/android-overview.html

    kotlin官方文档:http://kotlinlang.org/docs/reference/android-overview.html

    相关文章

      网友评论

          本文标题:Kotlin学习笔记

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