Kotlin学习笔记

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,098评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,213评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,960评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,519评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,512评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,533评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,914评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,804评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,563评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,644评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,350评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,933评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,908评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,146评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,847评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,361评论 2 342

推荐阅读更多精彩内容

  • 前言 人生苦多,快来 Kotlin ,快速学习Kotlin! 什么是Kotlin? Kotlin 是种静态类型编程...
    任半生嚣狂阅读 26,134评论 9 118
  • 基本数据类型 和java类似,首字母大写 Type BitWidthDouble 64Float ...
    王岩_shang阅读 647评论 0 2
  • 本文介绍了Kotlin入门应该知道一些基本语法概念。包括变量、常量、函数、空安全、类定义、类继承、数据类、接口定义...
    于卫国阅读 6,470评论 6 10
  • 项目未来可能需要使用kotlin开发,所以特此记录一下学习笔记,仅供参考,方便后期查询。已同步到GitHub上:K...
    下位子阅读 2,489评论 7 17
  • 系列文章全部为本人的学习笔记,若有任何不妥之处,随时欢迎拍砖指正。如果你觉得我的文章对你有用,欢迎关注我,我们一起...
    我爱吃栗子啊阅读 3,085评论 2 15