Kotlin知识点

Kotlin知识点

一、语言和开发环境

简洁性、兼容性、移植性
严格区分大小写,文件以.kt结尾

二、基础类型
1、注释
多行注释可以嵌套

2、变量
一条语句可跨多行,字符串、变量名不可跨行
硬关键字、软关键字、修饰符关键字
var可变、val不可变,不能声明变量时既不指定变量类型,也不指定变量初始值
变量确定类型以后不可需要使用类型转换方法转换,不会自动转

val:
局部范围的常量可以在声明时不指定初始值,在第一次使用之前赋值
类的常量属性,可以在类或结构体的构造器中指定初始值

3、整型Byte8位、Int32位、Short16位、Long64位
带“?”后缀的Int?类型的会自动映射成java的Integer对象
“===”此运算符求两个变量引用同一个对象
4、浮点型Float、Double
默认浮点类型为double
只有浮点型的数值才能使用科学计数形式表示
特殊的浮点数值:正无穷大(正浮点数/0.0)、负无穷大(负浮点数/0.0)、非数0.0/0.0
5、字符型
6、数值型类型之间的转换
.javaClass(Any类型的方法,获得变量对应的java类型)
97~122之间的随机数:Math.random() * 26 + 97
当一个算术表达式中包含多个数值型的值时,整个算术表达式数据类型将发生自动提升,如所有的Byte、Short类型将被自动提升到Int类型 
8、null安全
通过可空、非空类型的区分,可在程序中避免空指针异常
程序不能直接调用可控类型变量的方法或属性,但是可经过判断后使用
安全调用“?.”,若前面任何一个值为null则表达式返回null
Elvis运算“?:”,符号左边的表达式null,则返回左边表达式的值,若为null,否则返回符号右边表达式的值
“!!.”强制调用,不管变量是否为null,有可能会引发NPE
9、字符串
trimMargin()方法来去掉原始字符串前面的缩进,默认使用“|”作为边界符
String.capitalize()首字母大写 decapitalize 首字母小写
str.cotains(Regex("\\d{3}"));正则匹配是否有三个连续的数字
10、类型别名 typealias

三、运算符和表达式
“==”与equals等义,不再比较两个变量指向两个不同的字符串,==比较是空安全的
===判断指向同一个对象
位运算?运算符重载?

四、流程控制
分支结构
if语句可使用任意表达式作为分支条件来进行分支控制
if表达式,代替三目运算符,代码块的最后一个表达式的值将作为整个代码块的值
使用if作为表达式时,由于if表达式必须要有返回值,因此if表达式需要有else部分

when分支取代了java原有的switch语句
分支可以有匹配多个值、分支后面的不要求是常量,可以是任意表达式,对条件表达式的类型没有任何要求
when表达式可以没有else,但是必须覆盖所有情况
when条件分支:取代if。。else if链,不需要为when提供任何条件表达式,每个分支条件都是一个布尔表达式,当指定分支的布尔表达式为true时执行该分支
循环语句包括:初始化语句、循环条件、循环体、迭代语句
for-in 循环计数器相当于一个用val声明的常量,程序不允许在循环中对循环计数器进行赋值
指定跳出循环 外层循环:outer@  内层循环:break@outer
break、continue、return结束程序

五、数组和集合
数组
增加了XxxArray(Xxx可以是Byte、Short、Int等基本类型)
创建数组:工具函数arrayOf()\arrayOfNulls()\emptyArray()
Array(size: Int,init: (Int) -> T)构造器
Array类要求它的元素必须是引用类型,因此,如果程序将基本类型存入数组中,Kotlin会将这些基本类型的值自动装箱程包装类的实例,然后添加到数组
XXXArray不支持使用将元素初始化为null的方式来创建数组,基本类型的元素不允许为null
所有的数组都提供size属性
对数组使用for-in循环依然会被编译成使用基于索引的循环,并不会创建迭代器进行遍历,因此使用for-in循环遍历数组依然具有很好的性能
数组有indices属性,返回数组的索引区间
lastIndex返回数组最后一个元素的索引值=size-1
同时访问数组的索引和元素,使用数组的withIndex()方法,返回一个Iterable对象,对象的所有元素都是indexedValue
例如:for((index,value) in books.withIndex())
数组的常用方法(P77-80)
//同时初始化二位数组的两个维数
var b = Array(3,{IntArray(4,{0})})
//使用arrayOf初始化
var str1 = arrayOf(arrayOfNulls(3),arrayOf(“hello”))

集合
分为可变(添加、删除、修改元素)、不可变(只能读取元素)
Kotlin并未真正实现这些类,只是为java类型指定类型别名
Set
sortedSetOf()排序的Set
与array类似的功能:any、all、associateBy
add添加、
remove、removeAll、retainAll(保留与参数集合中共有的元素)、clear
MutableSet的iterator()方法返回MutableIterator对象,还提供了remove方法,可在遍历的时候删除元素
List
listOf、listOfNotNull、mutableListOf
get\indexOf\lastIndexOf返回元素在List中最后一次出现的位置\subList:例如,(1,3)输出1、2位置上元素
mutableListOf\arrayListof\返回的List集合都是可变的
add\removeat\get([])\clear
Map
mapOf\mutableMapOf\hashMapOf\linkedMapOf\sortedMapOf(按照key大小对key-value排序)
var map = mapOf("java" to 86,"kotlin" to 92)
遍历Map
for(en in map.entries){en.key  en.value}
for(key in map.keys){key map[key]}
for((key,value) in map){key value}
map.foreach({it.key  it.value})
可变map:
map["add"] = 123\map.put("add",123)\remove("key")\size(集合大小)

六、函数和Lambda表达式
如果为函数声明了返回值类型,则应该在函数体中使用return语句显式返回一个值,return语句的值既可以是常量,也可以是由值的变量,还可以是一个表达式
递归向已知方向进行
但表达式函数直接使用“=”号
混合使用命名参数和位置参数,那么命名参数必须位于位置参数之后,换句话说在命名参数之后的只能是命名参数
在定义函数之后将有默认值的参数放在普通参数的前面,并且不想为默认参数重新传入参数值,那么就只能使用命名参数为其他参数传入参数值
尾递归(tailrec)
函数将调用自身作为其执行体的最后一行代码,且递归调用后没有更多代码
tailrec fun factRec(n: Int,total: Int):Int =
if (n==1) total else factrec(n-1,total*n)

vararg:个数可变的参数,“*”将数组展开
重载:形参列表或返回值类型不同,仅有参数名不同、返回值类型不同或修饰符不同不能算重载,精准匹配(例如可变参数与单个值)

封闭函数传递局部函数

高阶函数:参数作为变量,参数类型
var myfun :(Int,Int) -> Int
myfun :: pow

lambda总是被大括号,定义lambda表达式不需要fun关键字,无须指定函数名,形参列表在->之前声明,
参数类型可以省略,函数体放在->之后,函数最后一个表达式自动被作为lambda表达式的返回值,无须使用return关键字
{(形参列表)-> 
	//零条到多条可执行语句
}
可定义表达式之后直接调用{}()形式
利用上下文推断类型,省略形参类型
省略形参名:只有一个参数则it代替
当函数最后一个参数是函数类型,且传入lambda表达式作为相应的参数,允许括号为指定lambda表达式
函数包含个数可变的形参和函数类型的形参,那么就应该将函数类型的形参放在最后,因为lambda表达式可放在括号外面
lambda不能指定返回返回值类型,使用匿名函数:
var test = fun(x: Int,y: Int): Int{return x+y},匿名函数形参类型也可被推断(可省略)
内联函数:复制代码(lambda代码少的时候适用) inline\noinline\crossinline

七、面向对象
将类的方法赋值给变量,调用者将作为第一个参数传入
dog.eat
var rn:(Dog)->Unit = Dog::eat
var et:((Dog,String)->Unit) = Dog:eat

中缀表示法:
infix,只能有一个参数,双目运算符的后面只能带一个参数

componentN方法与结构
operator fun component1() : String{}

var (name,age) = user
var (_,age) = user(适用_占位) 

数据类:
data 
主构造器至少需要有一个参数,所有参数需要使用val、var声明为属性
不能使用open、abstract、sealed修饰,也不能定义成内部类
生成copy方法\eaquals、hashCode方法\自动重写toString()形式为User(name=jhon,age=42)
为每个属性自动生成结构方法

生成的getter、setter是final修饰的,不能直接调用getter、setter

幕后字段、属性P147、148


模块:编译在一起的Kotlin文件,一个idea模块,一个maven项目,一个gradle源集

变量在编译阶段只能调用其编译时类型所具有的方法,但运行时则执行其运行时所具有的方法
若两个类之间没有继承关系,编译出现错误is运算符的作用是在进行强制类型转换之前,首先判断前一个变量是否引用后一个类,或者其子类的实例
使用了is\!is判断,系统就会自动将变量的类型转换为目标类型
as\as?强制转型,不安全的转型失败会报错(ClassCastException),安全的转型如果转型失败,返回null

成员方法执行动态解析(由运行时类型决定),扩展方法执行静态解析(有编译时类型决定)
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值