Kotlin
2020-07-01 17:44:35 30 举报
AI智能生成
Kotlin是一种现代的跨平台编程语言,由JetBrains公司开发。它运行在Java虚拟机上,并可以与Java代码互操作。Kotlin具有简洁、安全、实用的特点,能够提高开发者的生产力。它的语法简洁明了,易于学习和使用。Kotlin还提供了许多高级功能,如空值安全、类型推断、扩展函数等,使得代码更加健壮和可维护。此外,Kotlin还支持与JavaScript、Android和Native平台的无缝集成,使得开发者可以轻松地构建高性能的应用程序。总之,Kotlin是一种强大而灵活的编程语言,适用于各种应用场景。
作者其他创作
大纲/内容
特点
Kotlin 可以编译成Java字节码,也可以编译成 JavaScript,方便在没有 JVM 的设备上运行。
静态语言,支持多种平台,包括移动端、服务端 等
Null safe
支持lambda表达式(比Java8更好)
兼容java
基础语法
函数
普通函数 sum(a: Int, b: Int): Int { // Int 参数,返回值 Int
无返回值函数 printSum(a: Int, b: Int): Unit unit可省略
可变长参数 fun vars(vararg v:Int)
匿名函数 val sumLambda: (Int, Int) -> Int = {x,y -> x+y}
常量与变量
可变变量:var <标识符> : <类型> = <初始化值>
不可变 val <标识符> : <类型> = <初始化值>
$:字符串模板(取值)
NULL检查机制
?---var age: String? = "23" ---?表示可为空
!!---val ages = age!!.toInt() ---- 抛出空指针异常
?.----val ages1 = age?.toInt() ----不做处理返回 null
val ages2 = age?.toInt() ?: -1 ---age为空返回-1
:: 标识可以将方法作为参数:调用方式:(this::method()) (Object object::method())
inline 调用一个通用方法频繁调用 会有压栈 出栈操作。防止次操作消耗资源,给方法添加此关键字
自动类型转换 fun getStringLength(obj: Any): Int? { 用is判断 类似java instanceof
区间
操作符形式 .. 的 rangeTo 函数辅以 in 和 !in 形成
for (i in 1..4) print(i) // 输出“1234”
for (i in 4..1) print(i) // 什么都不输出
if (i in 1..10) { // 等同于 1 <= i && i <= 10
step---for (i in 1..4 step 2) print(i) // 输出“13”
downTo---for (i in 4 downTo 1 step 2) print(i) // 输出“42”
until--for (i in 1 until 10) { // i in [1, 10) 排除了 10
标识
in 在某个范围中
downTo:递减,循环时可用,每次减1
step:步长,循环时可用,设置每次循环的增加或减少的量
when:Kotlin中增强版的switch,可以匹配值,范围,类型与参数
is:判断类型用,类似于Java中的instanceof()
as:设置别名
数据类型
简介-注意
Kotlin中数字相关的内置类型有: byte、short、Int、Long、Float、Double
没有自动向上转型
Long类型结尾必须为大写的L 如1024L
字符Char不是Number,用单引号来声明,比如'c'
位运算符 kotlin中使用or和and关键字来替代其他字:shl(有符号左移),shr(有符号右移),ushr(无符号右移),xor(按位异或),inv(按位取反)
类型转换
toByte(): Byte
toShort(): Short
toInt(): Int
....
toShort(): Short
toInt(): Int
....
数组
定长数组:val fixedSizeArray = arrayOfNulls<Int>(10)
空数组: val empty = emptyArray<Int>()
装箱操作:val arr = arrayOf(1, 2, 3) //还有其他比如IntArrayOf,BooleanArrayOf等
闭包初始化:
val array = Array(10,{num-> num})
for (i in 0..9) print(array[i])
val array = Array(10,{num-> num})
for (i in 0..9) print(array[i])
数组循环
遍历区间 for (item : Int in 1..10){
遍历数组 val arr = arrayOf(1, 2, 3)
for (item : Int in arr){
for (item : Int in arr){
遍历List集合 val list: MutableList<Int> = mutableListOf(1, 2, 3)
for (item : Int in list){
for (item : Int in list){
withIndex(),配合for---for ((index, value) in (1..10).withIndex()){
withIndex() for ((index, value) in arr.withIndex())
字符串
多个字符串 """ 包起来
trimMargin() 方法来删除多余的空白
字符串模板 $ 如:"i = $i" // 求值结果为 "i = 10"
类和对象
实例
非空属性延迟初始化--lateinit
get set 默认实现:val simple: Int? // 类型为 Int ,默认实现 getter ,但必须在构造函数中初始化
类可以有一个 主构造器,以及一个或多个次构造器,主构造器是类头部的一部分,
位于类名称之后 如: class Person constructor(firstName: String) {}
位于类名称之后 如: class Person constructor(firstName: String) {}
用构造函数创建类实例 如:val site = Runoob()
主构造器
class Person constructor(firstName: String) {
init { //用init初始化
init { //用init初始化
如果构造器有注解,或者有可见度修饰符,
这时constructor关键字是必须的,注解和修饰符要放在它之前
这时constructor关键字是必须的,注解和修饰符要放在它之前
次构造函数
constructor (name: String, age:Int) : this(name) { 二级构造函数
次构造函数都要,或直接或间接通过另一个次构造函数代理主构造函数。在同一个类中代理另一个构造函数使用 this 关键字:
次构造函数都要,或直接或间接通过另一个次构造函数代理主构造函数。在同一个类中代理另一个构造函数使用 this 关键字:
抽象类
继承
Kotlin 中所有类都继承该 Any 类
子类没有主构造函数 调用主类 constructor(ctx: Context) : super(ctx)
覆盖
子类内部类调用子类超类----super@Man.open() //这里使用@标记super为谁的super
多超类情况--super<A>.f() //super后跟<超类名>来标记调用的是那个超类的函数
接口
接口可以实现方法体
接口中的属性只能是抽象的,不允许初始化值,实现接口时,必须重写属性
伴生对象
简介:每个类可以对应一个伴生对象--伴生对象的成员类似于Java的静态成员
类中定义 --companion object {
伴生对象中 --静态方法 注解 @JvmStatic fun ofDouble(
伴生对象中 --静态变量 注解 @JvmField val TAG: String = "hello"
Kotlin 扩展
对一个类的属性和方法进行扩展
对一个类的属性和方法进行扩展
扩展函数
原有方法做扩展,不会对原类做修改---fun receiverType.functionName(params)
伴生对象的扩展
class MyClass {
companion object { } // 将被称为 "Companion"
}
companion object { } // 将被称为 "Companion"
}
Kotlin 数据类与密封类
数据类
包含数据的类,关键字为 data---data class User(val name: String, val age: Int)
主构造函数至少包含一个参数。
所有的主构造函数的参数必须标识为val 或者 var ;
数据类不可以声明为 abstract, open, sealed 或者 inner;
数据类不能继承其他类 (但是可以实现接口)。
密封类--密封类用来表示受限的类继承结构
泛型
声明
class Box<T>(t: T) {
var value = t
}
var value = t
}
委托
by 实现委托
by 实现委托
类委托
有两个对象参与处理同一个请求,接受请求的对象将请求委托给另一个对象来处理
属性委托
属性委托指的是一个类的某个属性值不是在类中直接进行定义,而是将其托付给一个代理类,从而实现对该类的属性统一管理
延迟属性 Lazy
val lazyValue: String by lazy {
println("computed!") // 第一次调用输出,第二次调用不执行
"Hello"
}
println("computed!") // 第一次调用输出,第二次调用不执行
"Hello"
}
可观察属性 Observable
Delegates.observable() 函数接受两个参数: 第一个是初始化值, 第二个是属性值变化事件的响应器(handler)。
Not Null
notNull 适用于那些无法在初始化阶段就确定属性值的场合。---var notNullBar: String by Delegates.notNull<String>()
lambda表达式
简介:可以简化写一些不必要的嵌套回调方法---表达式,只支持单抽象方法模型
let
object.let{ 代替对象访问其属性和方法
object?.let{ 对象不为空操作
with
调用同一个类的多个方法时,可以省去类名重复,直接调用类的方法即可
例子
val item = getItem(position)?: return
with(item){ //item.titleEn
holder.tvNewsTitle.text = StringUtils.trimToEmpty(titleEn)
with(item){ //item.titleEn
holder.tvNewsTitle.text = StringUtils.trimToEmpty(titleEn)
run
let和with两个函数的结合体---可判空 可影藏类名
run函数是一个闭包形式返回,返回的是最后一行的值
apply
run函数很像,唯一不同点就是它返回的值是对象本身
例子:view--model转化中用如:View.inflate
例2:多层判空问题
also
和let相似,不同 返回的是传参对象的本身
0 条评论
下一页