Kotlin语法总结
变量、常量
var val 类型自动推断 latinit var val b: String by lazy{} 不支持自动转型 如Int不会自动转为Float new类的时候不需要new关键字
函数
方法声明 参数 返回值 fun a: Int 写在方法名后面 方法表达式 方法参数默认值(name: String = "abc")
符号
and==>& or==>| a.not()==>!a in 1..10==>[1,10] step 2 1 until 10==>[1.10) 10 downto 1==>[10,1] Any==>Object is==>instanceOf 并且不需要强转 如果强转使用as list.forEach{ print(it) //如果只有一个参数,可以直接使用it } === 比地址 == 相当于equals
when表达式
when(obj){ true->{} 1,2->{} else->{} }
数组、集合
arrayOf listOf setOf<Int>() mapOf<String,String>("1" to "2") map["1"] = "3" 可变参数 vararg
空安全
var list: List<String>? = null list!!.size() 为空会抛异常 list?.size() 为空不执行 list?.size ?: 0 为空走默认值
面向对象
修饰符 public(默认) internal protected private 主构造方法 类名后写 class Animal(var name: String) 加入var或val则变为全局变量 也可以写init方法 二级构造方法 如果有主构造方法必须引用主构造方法,如果没有则不用引用 Getter Setter var age: Int = 0 //默认带有setter getter var name: String = "" get() = field set(value){ field = value } 继承 类默认是final的,如果使其能被继承,则需要声明open 关键字 : 如果父view有多个构造方法,则可以写多个二级构造方法 比如自定义View,如果要想该View既能在代码中使用,又想在xml中使用,则写主构造方法就不太合适
数据模型类
构造方法中至少有一个属性,切必须有var val修饰 自动重写equals() hashCode() toString()方法 data class Animal(var name: String? = null, var age: Int) 如果需要无参构造方法调用,后面再分别赋值,则可以给其里面的参数声明默认值
伴生对象
伴随着类诞生的对象,仅有一个 class MyFragment:Fragment{ companion object{ const val TAG = "aaa" //public static final String TAG fun newInstance():MyFragment = MyFragment } } 单例 object User{ }
接口,内部类,Lambda表达式
内部类默认是静态内部类,只有使用inner修饰才变成非静态内部类,持有外部类的引用 setOnClickListener{ print(it.id) } thread{ //TODO }
反射
MainActivity::class //Kotlin的KClass类型 MainActivity::class.java //Java的Class类型