kotlin相比java的一些变化
方法名fun,变量和参数命名,前面是名称,后面是类型
创建对象不用new ,直接对象名加括号
控件不用findeviewbyid
重写override,改为写在前面
继承用分号:,实现用逗号,
!!后的对象不可为null,会抛异常
构造方法可以卸载类名后
对象实体的构建,不用setter 和getter了
val表示常量 final. var 表示可修改
when代替switch case
str?.length //如果str不为空直接调用,如果为空直接返回null,而不会抛出空指针异常
1, 标准函数和静态静态方法
with 接受两个参数,第一个对象,lambda表达式,最后一行代码作为返回
run 使用场景跟with十分相似,不能直接调用,要调用某个对象的run才行,只结束一个lambda参数。let 和run类似。let用it,run用this 返回实体
apply 跟run相似,无返回值,返回对象本身 。also和apply类似,also it,appy this 返回实体
repeat 重复执行lambda表达式中内容
定义静态方法
companion object(在companion方法里面加@JvmStatic注解,会编译为真正的静态方法
顶层方法(创建File的文件)
只有在单例类,companion object ,顶层方法才可以使用const
https://www.jianshu.com/p/bf61d1633620
https://www.jianshu.com/p/cfa7e3c33227
2,延迟初始化 密封类
lateinit ; by lazy。
3,密封类 sealed:https://www.jianshu.com/p/21e0a6739252
4,扩展函数和运算符重载
扩展函数可以让你作为一个类成员进行调用的函数,但是是定义在这个类的外部
fun String.swap(index1: Int, index2: Int): String
编译后
public static final String swap(@NotNull String $receiver, int index1, int index2)
Kotlin中的String. 接收者被当做Java方法中的第一个参数传入。
KotlinExampleKt.swap("abc",0,1);
扩展函数原理:https://www.jianshu.com/p/bab988f5605a
5,高阶函数 内联函数 noinline crossinline(有点没搞懂)
高阶函数就是把一个函数作为另一个函数的参数或返回值。foreach,map,flatmap
inline让编译器直接把代码复制到调用的地方,解决了函数调用时的开销
noinline 函数有多个函数参数, 有些我不希望被inline, 那就可以用noinline来修饰
如果想 lambda 也被 inline,但是不影响调用方的控制流程,那么就要是用 crossinline
https://www.jianshu.com/p/cd0be9b887ec
6,泛型和委托,实现一个字的lazy函数(待了解)
7,协程的基本用法,更多的作用域构建,协程简化回调
协程创建的方式有两种launch()、async()又返回值,
线程切换 withContext (Dispatchers.Main/Dispatchers.IO),需要在协程或者suspend方法使用
现在有一个场景,需要将接口a中的数据和接口b中的数据合并,用协程会很方便
https://www.jianshu.com/p/96ac85beb8fd
Dsl构建专有的语法结构
8,使用infix函数构建
Kotlin允许在不使用括号和点号的情况下调用函数,那么这种函数被称为 infix函数。
9,java和kotlin相互调用可以使用java和kotlin混合编程,
kotlin->java
像kotlin集合类API就是直接用的java的api
Kotlin调用Java中的Getter 和 Setter,可以直接使用属性名字
调用java中的void方法,Kotlin 调用时中返回 Unit
kotlin掉java的方法,该方法为kotlin关键字,反引号(`)字符转义。MathTools().`is`(1)
java->kotlin
java访问kotlin属性,还是setxx,getxx,如果是is开头,setxx,isxx
kotlin中用@JvmField var NO = 0标明实例字段,java调用d.NO = 10)
访问静态通过加Companion访问,Department.Companion.getInnerID(),@JvmField注解可以直接访问
kotlin中internal对应java public
java像Kotlin中一样可以调用多个重载,可以使用@JvmOverloads注解
Kotlin中的函数加上注解@Throws(Exception::class),java调用的时候才会在编译时提示异常
https://www.jianshu.com/p/99caa12b1331
面试
1,协程是什么,挂起是什么,协程会阻塞吗
var job=GlobalScope.launch job.join()开启协程 Job.cancel() 取消
var deferred=GlobalScope.async job.await()拿到返回结果
runBlocking 会阻塞主线程
协程就是切线程
启动方式 说明
runBlocking 创建新的协程,运行在当前线程上,所以会堵塞当前线程,直到协程体结束
GlobalScope.launch 启动一个新的线程,在新线程上创建运行协程,不堵塞当前线程
GlobalScope.asyn 启动一个新的线程,在新线程上创建运行协程,并且不堵塞当前线程,支持 通过await获取返回值
挂起及时可以自动切回来的切线程
当线程执行到协程的 suspend
函数的时候,暂时不继续执行协程代码了。从suspend开始在指定的线程继续往下执行,suspend函数执行完后,协程会自动帮我们把线程再切回来。
挂起的非阻塞式指的是它能用看起来阻塞的代码写出非阻塞的操作;
非阻塞式」这个是挂起的一个特点,协程的挂起,就是非阻塞式的,而不是传统的「阻塞式的挂起」。阻塞不阻塞,都是针对单线程讲的,切了线程,肯定是免谈的,你TM都跑到别的线程了,之前的线程就自由了,可以继续做别的事情了
2,with run/let apply/also的区别
标准函数,任何的Kotlin代码都可以自由的调用
with 接受两个参数,第一个对象,lambda表达式,最后一行代码作为返回
run 通过对象调用run,接受一个lambda表达式,this返回实体
let 跟run相似,it返回实体
apply 跟run相似,无返回值,this返回实体
also 跟apply相似,it返回实体
3,协程的扩展函数有用过吧,编译后对应java的什么形式(类似这样问)?
kotlin
fun String.swap(index1: Int, index2: Int): String
编译后
public static final String swap(@NotNull String $receiver, int index1, int index2)
Kotlin中的String. 接收者被当做Java方法中的第一个参数传入。
4, 与java相比,kotlin有哪些新特性。
kotlin也是寄生在jvm平台,kotlin源代码都会被编译成class文件
(1)kotlin对可空类型的支持,通过编译期检测可能存在的空指针异常,使程序更可靠。
(2)对函数类型的支持。使代码更简洁,并且多线程安全。
(3)没有了static,有顶层函数和顶层方法,支持扩展函数。类默认public final。函数不用声明异常。
(4)对集合支持链式操作,对类型系统就行了新的分类,不区分基本类型和对象类型。
5,伴生对象companion,jvmstatic ,jvmfield等
companion
每个类可以对应一个伴生对象
伴生对象的成员全局独一份
伴生对象的成员类似于Java的静态成员
@JvmStatic
调用kotlin类的方法需要加上,java调用是变成真正的静态类,不用加companion
@JvmField
调用kotlin类的成员变量需要加上,将访问权限改为public