2020-11-15 学习日记

1、Java虚拟机和Dalvik虚拟机的区别?
首先虚拟机本身可看作是一个程序,Java虚拟机会把编译好的Java字节码转成机器码,在机器上运行;Dalvik执行的是Dalvik字节码,所有的Dalvik字节码由Java字节码转换而来,并被打包到一个Dex文件中(谁来转换和打包呢?),Dalvik通过解释执行这些Dalvik字节码来执行程序
2、Dalvik虚拟机和ART虚拟机区别?
Dalvik虚拟机采用的是及时编译技术,即每次执行程序都是边翻译Dalvi字节码边执行,而ART虚拟机是在编译时就把所有的Dalvik字节码转成了机器码,以后每次执行程序只需要直接执行这些机器码即可;ART就是空间换时间,存储空间提高了10%-20%,安装时间也长了
3、 Kotlin中if和java的区别
用法基本一样,唯一区别是kotlin中if是可以返回值的
4、Kotlin中when的作用
可以很好替代java中的switch,具体不再说了
5、Kotlin循环

    /** 循环 **/
    fun xunhuan(){
        /** 依次输出[0,10]元素 **/
        for(i in 0..10){
            println(i)
        }
        /** 依次输出[0,10)元素 **/
        for(i in 0 until 10){
            println(i)
        }
        /** 依次输出[10,0]元素 **/
        for(i in 10 downTo 0){
            println(i)
        }
        /** 依次输出[0,10](每次+2)元素 **/
        for(i in 0..10 step 2){
            println(i)
        }
    }

6、kotlin中的继承
6.1主构造函数
首先kotlin类默认是不可继承的,如果想要使一个类可以被继承,需要加上open关键字;类的主构造函数都直接跟在class关键字后面,如果需要在构造函数执行时做些初始化操作,可以使用init{初始化操作}:

open class Person(name:String, age:Int){
    init{
        println("persion-name:$name")
        println("persion-age:$age")
    }
}
class Student(sex:String, name: String, age: Int):Person(name,age){
    init {
        println("student-name:$name")
        println("student-age:$age")
        println("student-sex:$sex")
    }
}
val student=Student("男","wjc",23)

6.2次构造函数
kotlin中允许有次构造函数而没有主构造函数,此时因为没有了主构造函数,所以声明时不需要在class后面加参数之类的而且也不用在父类后面跟()了,只需要在次构造函数里调用super父类构造函数即可:

class Driver : Person {
    constructor(level: String, name: String, age: Int) : super(name, age)
}
val driver=Driver("高级司机","jwc",22)

7、接口
接口使用和Java基本一样,只是实现接口关键字由implements变成了':'(继承也是),然后还允许接口中方法有默认实现,有默认实现的方法可以不用必须重写:

interface TestInterface {
    fun doTask1()
    fun doTask2(){
        println("默认整理课件")
    }
}

class Teacher : TestInterface {
    override fun doTask1() {
        println("批改作业")
    }
}
val teacher=Teacher()
        teacher.doTask1()
        teacher.doTask2()

8、java和kotlin中函数可见修饰符对比:

修饰符 java kotlin
public 所有类可见 所有类可见(默认)
private 当前类可见 当前类可见
protected 当前类、子类同一包路径下的类可见 当前类、子类可见
default 同一包路径下的类可见(默认)
internal 同一模块的类可见

9、数据类
在class前面加上data关键字即可,kotlin会知道我们希望创建一个数据类,然后在后面跟随对应的参数名字和类型即可(当类中没有任何代码时,{}也可以省掉),就不用再重写equals这种方法了,主要两个数据类对象的各个参数值相等,那么它们就是相等的:

data class DataTest(val name:String)
val data1=DataTest("data")
val data2=DataTest("data")
println(data1==data2) //结果输出true

10、单例类
直接创建Object类型的类,即是单例类:

object Danli {
    var count=1;
    fun get(){
        println(count)
        count++
    }
}
/** 输出1、2、3、4 **/
for (i in 0..3){
     Danli.get()
}

11、Lambda表达式

//1、创建数组并读取元素(不能添加元素)
val list= listOf("ww","wa")
for (o in list)
    println(o)
//2、创建数组并添加、读取元素
val list= mutableListOf("ww","wa")
list.add("dafa")
for (o in list)
    println(o)
//3、set用法一样,不再多说
//map,也不能添加元素,只能读
val map = mapOf("1" to 1, "2" to 2, 3 to 3)
for ((key, value) in map) {
    println("key=$key,value=$value")
}
//map,可以添加元素
val map = mutableMapOf("1" to 1, "2" to 2, 3 to 3)
map["89"]=89
for ((key, value) in map) {
    println("key=$key,value=$value")
}

12、集合中的lambda表达式
{参数名:参数类型,参数名:参数类型...->函数体(最后一行会作为结果返回)}
常用的:
list.maxBy{it.length()}:遍历集合取条件的最大值
list.filter{it.length<5}:遍历集合取符合条件的元素
list.map{it.toUpperCase()}:遍历集合对集合中元素进行转换
list.any{it.length<5}:遍历集合判断集合中是否有任一元素满足条件
list.all{it.length<5}:遍历集合判断集合中元素是否都满足条件
13、kotlin匿名函数

//需要使用object关键字
Thread(object :Runnable{
            override fun run() {
                TODO("Not yet implemented")
            }

        }).start()
//可以转成lambda表达式
Thread(Runnable { TODO("Not yet implemented") }).start()
Thread { TODO("Not yet implemented") }.start()

14、kotlin判空

        //判空操作
        var a:String?=""//代表a有可能为null
        a?.length//如果a为空返回null,否则返回a.length
        a!!.length//表示a绝对不会为空
        a?:"空"//如果a不为null就取a,为null就取后边的
        doTask(null)
        private fun doTask(person: TestInterface?) {
        //let表达式适合判断全局变量以及一次判空后续不再重复判空的情况
        person?.let { person ->
            person.doTask1()
            person.doTask2()
              }
        }

15、参数指定名字
kotlin中如果方法的参数有默认值,则该参数可以不传值:

fun ts(num:Int=1,ss:String){

}
ts(ss="da")//调用时指定参数名

你可能感兴趣的:(2020-11-15 学习日记)