android面试-kotlin

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

你可能感兴趣的:(android面试-kotlin)