Android Developer Learn Kotlin

1.Kotlin 介绍

关于 Kotlin 的介绍,没有什么会比官网介绍的更权威了,

so. 这里就偷个懒把网址给出来了!

Kotlin 语言中文站

Kotlin 语言英文站

一切关于 kotlin 都可以从上面的网站获取哦!

2.Kotlin 数据类型

kotlin 的数据类型基本类似于 java,

看看如下的代码就都明白了


3.Kotlin 类和对象

同样还是看代码,简单明了

4.NullPointerException

关于空指针异常问题,肯定是要提及的,因为这是 kotlin 安全性最直接的体现

5.类型转换


6.区间

此部分虽然内容比较少,但还是要提一下

7.变量

其实看上面的代码就知道生命变量用到了varval

那么他们有什么区别,跟 java 又有什么区别

从字节码层面理解finalconst的作用

java 代码

kotlin 代码

8.函数

9.成员变量和成员方法

成员变量的初始化和延迟初始化

get 和 set 方法的使用

10.中缀/分支/when 表达式

如 if 和 when 不仅仅可以作为分支语句,还可以作为表达式使用,看看如下的代码吧

11.抽象类和接口


12.可见性

private public protected 同 java
新增 internal 表示模块内可见

13.object

kotlin中的单例

14.伴生对象和静态

1.首先说明 java 中的大部分静态方法kotlin 中都可以通过包级函数来实现, so 当想问 kotlin 中静态怎么写的时候,先考虑是否通过包级函数就可以实现呢?

2.确实有些类中需要用到静态方法,如Integer 中的 valueOf() 等,这时候就需要用到 kotlin 的伴生对象了看代码吧

那如上的 kotlin 类怎么在 java 中调用呢?

private AAA a = AAA.Companion.ofDouble(3.0)

那如上的调用是不是有点麻烦呢,看看加上@JvmStatic注解的方法怎么调用吧

private AAA a = AAA.ofDouble(3.0)

至于静态成员的用法同上,也是写在伴生对象里,同样可以用@JvmField来进行注解

15.方法重载和默认参数

重载:同一个类中方法同名不同参

重写:子类中的某个方法和父类中某个方法同名且同参

kotlin 中使用默认参数可以代替一部分的方法重载

关于默认参数看一个小问题(使用@JvmOverloads注解)

不使用注解 在 java 中调用会报错需要一个参数

使用注解,就没有如上的问题了

16.扩展属性和扩展方法

//扩展方法

//扩展方法-操作符

//扩展方法在 java 中的调用


//扩展属性

17.数据类

但是当你用 data class 去当做 javaBean 用的时候会出现一些问题

原因是因为: javabean 需要一个无参的构造器,并且类不能是 final 的

但是在 kotlin 中 data class 恰恰是 final 的,如上图的 Country 也是没有无参的构造器的,这些可以通过kotlin 的字节码然后反编译看的到.

那怎么用呢?

利用kotlin 提供的 noargallopen 插件来注解 data class它们会在编译时期通过修改字节码的方式为 class 取消 final 和增加无参的构造器

至于noarg`allopen`插件的使用步骤,看下面图的演示吧(共计7个步骤)



如下的代码方便粘贴,哈哈

classpath "org.jetbrains.kotlin:kotlin-noarg:$kotlin_version"
classpath "org.jetbrains.kotlin:kotlin-allopen:$kotlin_version"
apply plugin: 'kotlin-noarg'
apply plugin: 'kotlin-allopen'
noArg{
    annotation("com.cml.cmlkotlin.annotation.PP")
}
allOpen{
    annotation("com.cml.cmlkotlin.annotation.PP")
}

18.内部类

kotlin 中的内部类默认是静态的,想要内部类非静态那么就用inner来修饰内部类即可

匿名内部类

19.枚举

20.密封类

在kotlin V1.1之前

密封类的子类必须在密封类内部
在 kotlin V1.1之后

密封类的子类,只要跟密封类在同一个文件即可

待续:lambda 基本运算符 变长参数 属性代理