一、定义常量/变量
val 定义常量 getter
var 定义变量 setter getter
lateinit 和 var配合使用,表示可以延迟初始化的变量;基础数据类型和val修饰的变量不能使用;
「Kotlin 的基本数值类型包括 Byte、Short、Int、Long、Float、Double 等。不同于Java的是,字符不属于数值类型,是一个独立的数据类型」
注意: ? 定义变量,表示可以为空; eg: var name: String? = ""
? 变量后边,表示如果变量为空则不处理; eg:name?.length
!! 变量后边,表示变量必然不能为空,如果为空则会抛出空指针异常;eg: name!!.length
访问权限修饰符:
private 只在本文件可见;
protected 同一个文件和子类中可见;
public 所有调用的地方都可见;
internal 同一个模块中可见,表示这个类方法只适合当前module使用。
二、定义类
class/final class 定义一般类,默认定义类都是final 类;
open class 定义可以继承的类,可以继承类的中函数如果需要重写也需要添加open
abstract class 定义抽象类,
enum class 枚举类
object 静态类,方法和变量都是静态的;
「衍生:companion object 修饰为伴生对象,伴生对象在类中只能存在一个,类似于java中的静态方法 Java 中使用类访问静态成员,静态方法。相当于一个静态区域」
inner class 内部类;内部类中调用外部 eg:[email protected]
data class 数据类;
为了保证生成代码的一致性以及有意义,数据类需要满足以下条件:
主构造函数至少包含一个参数。
所有的主构造函数的参数必须标识为val 或者 var ;
数据类不可以声明为 abstract, open, sealed 或者 inner;
数据类不能继承其他类 (但是可以实现接口)
sealed class 密封类,不能直接实例化,只能实例化子类;
构造函数:
主构造函数:写到类名后边 eg: class object(var name:String)
主构造器中不能包含任何代码,初始化代码可以放在初始化代码段中,初始化代码段使用 init 关键字作为前缀。
次构造函数:类也可以有二级构造函数,需要加前缀 constructor;
三、定义接口
interface
允许方法有默认实现,
接口中的属性只能是抽象的,不允许初始化值,接口不会保存属性值,实现接口时,必须重写属性;
四、Lambda表达式
这是Lambda表达式最完整的语法结构。
{参数名1:参数类型,参数名2:参数类型 -> 函数体}
() -> Unit//表示无参数无返回值的Lambda表达式类型
(T) -> Unit//表示接收一个T类型参数,无返回值的Lambda表达式类型
(T) -> R//表示接收一个T类型参数,返回一个R类型值的Lambda表达式类型
(T, P) -> R//表示接收一个T类型和P类型的参数,返回一个R类型值的Lambda表达式类型
(T, (P,Q) -> S) -> R//表示接收一个T类型参数和一个接收P、Q类型两个参数并返回一个S类型的值的Lambda表达式类型参数,返回一个R类型值的Lambda表达式类型
1、首先最外层一对大括号。
2、如果有参数传入Lambda表达式,我们还需要声明参数列表。
3、参数列表的结尾使用->符号,表示参数列表的结束以及函数体的开始,函数体中代码长度不限
4、Lambda表达式最后一行代码表示Lambda表达式的返回值。
eg: val maxLengthFruit = list.maxBy({ fruit: String -> fruit.length })
5、当Lambda是函数的最后一个参数时,可以将Lambda表达式移到函数的括号外面。
eg: val maxLengthFruit = list.maxBy(){ fruit: String -> fruit.length }
6、如果Lambda是函数的唯一参数的话,可以省略函数的括号。
eg: val maxLengthFruit = list.maxBy{ fruit: String -> fruit.length }
7、由于Kotlin拥有出色的类型推导机制,所以Lambda的参数列表大多数情况下不需要声明参数类型
eg: val maxLengthFruit = list.maxBy{ fruit -> fruit.length }
8、Lambda表达式只有一个参数时,也没必要声明参数名称,可以用it代替。
eg: val maxLengthFruit = list.maxBy{ it.length }
五、高阶函数
高阶函数即指:将函数用作一个函数的参数或者返回值的函数。
eg: fun hightFun(x: Int, y: (Int,Int) -> Int){}