1.扩展属性没有幕后字段,不能初始化,可以定义getter方法
2.运算符重载要求函数名相同,参数个数相同,对参数类型和返回类型没有要求
3.infix关键字可以自定义运算符,称之为中缀表达式,调用的时候类似于运算符的操作,不必用.调用,但是一般不推荐使用,会导致代码可读性降低,逻辑混乱
4.Kotlin中的表达式返回值就是该代码块中的最后一行
5.*运算符将数组展开成一个个元素,适用于vararg定义的变长参数(目前只支持展开Array)
例:
val array = intArrayOf(1,2,2,3,4)
testArray(1,2,3,*array,param = 1)
fun testArray(vararg arrays:Int,param:Int){
}
6:接口:一种约定,抽象接口可以相互继承,继承即抽象的进一步具体
7:抽象类和普通类一样可以有自己的状态:成员变量,该成员变量可以初始化,有幕后字段field,接口中可以定义成员变量(实际是定义了get和set方法),但不能初始化,没有幕后字段field
8:Kotlin和Java类似,遵循单继承多实现的原则
9:接口中定义的方法有默认实现,则它的实现类中可以不实现该抽象方法
10:抽象类即半成品,接口即协议
11:抽象类默认是 open修饰符,非抽象类默认是final修饰符,因此要继承普通的类必须使用open关键字
12:从设计的角度考虑,抽象类决定了他是什么,接口决定了他能做什么。
13:当Kotlin中继承或实现的方法完全相同时(签名和返回值),使用super的方式来指定调用哪个父类或接口的对应方法
方法签名:方法的方法名和参数列表(包括类型和顺序)
14:Kotlin单例使用object关键字,默认实现编译成Java代码实现如下:
Kotlin -> object class A
Java ->
class A{
public static final A INSTANCE;
static new A();
private A(){
INSTANCE = (A)this;
}
}
15:Kotlin中的包级函数扮演者Java中静态方法的角色
16:companion object用于在类的内部定义一个该类的伴生对象,每个类都对应一个伴生对象,伴生对象全局独一份。在伴生对象内部定义的方法和属性类似于Java类中的静态方法和静态属性!添加注解@JVMStatic和@JVMField以后,可以再Java中直接调用。
17:Kotlin中的方法重载大多数情况下都可以使用函数的默认参数类实现
18:扩展属性类似于接口属性,没有幕后字段field,不能初始化,实际上扩展属性就相当于扩展的get和set方法。
19:var属性延迟初始化,使用lateinit关键字,该属性不能为空,不能为primitives(int,float等),val属性延迟初始化使用by lazy{}
20:属性代理实际是通过设置代理对象对getValue和setValue运算符的重载,进行get和set方法内部实现细节封装,外部访问属性时并不关心实现过程,只关心实现结果。
class A{
val b by B()
}
//代理对象
class B {
operator fun getValue(thisRef:Any?,property:KProperty<*>):Any?{
return null
}
operator fun setValue(thisRef: Any?property: KProperty<*>,value:Any){
//TODO do your something
}
}