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")//调用时指定参数名
网友评论