Kotlin -> “更好的Java”
Java和kotlin平行关系,最终都翻译为Class文件
Java 一切方法和属性 尽在类中 - Kotlin 也这样吗? if No 导致了什么??
顶层函数
Kotlin 取消Static 而引入 Object
Java的静态属性
Kotlin的伴生对象
根类为什么不同!? Object 与 Any
Kotlin
Java
为什么这些方法是必须的?
equals 等价关系:自反性,对称性,传递性,一致性,与null比较
hashCode:唯一标示这个对象,返回hash值
toString:返回这种形式 ToStringExample@4554617c ,@后面的为散列码
泛型
kotlin 扩展函数 & Java静态函数
类型系统
类型推导
kotlin引入特殊类
data class
inner class
kotlin <==> Java 转换
Code –> Convert Java File To Kotlin File
Tools –> Kotlin –> Show Kotlin Bytecode - Decompile
Java返回void - kotlin返回Unit
类
获取对象的引用:val c = myObj::class
关键字:kotlin - Java ‘’转义
注解
@JvmName:包级属性和函数
@JvmField:kotlin属性 - Java 中的一个域
@JvmStatic:kotlin - Java 生成静态方法
Java setter & getter 方法 - kotlin 属性
类型系统
空安全 & 平台类型
映射类型:Java 映射到对应的 kotlin类型
映射发生在编译期间,运行时表示保存不变
fun 那些事儿
表达式:{ a,b -> a+b} 参数类型,返回值类型
this 代表调用函数的对象
it 指的是iterator 只有一个参数时可默认为it
定义:输入(引数)— 输出(传出值)编程范式
特性
函数即输入与输出的关系,不关心过程,只重结果
stateless:函数不维护任何状态
immutable:输入数据不能动,返回新的数据集
lambda 最少样板代码传递代码块
lambda = 匿名函数
fun 链式调用 (funA().funB():相应funA的返回值去调用funB)
函数式操作
filter 筛选
map 映射
reduce 归约
groupBy 分组
主:
从:声明在类体内以 constructor 关键字
特性:
必须带constructor
次构造函数都需要用 this 关键字直接或间接委托给主构造函数
访问控制: 权限修饰 public,private,protected
初始化:伴生对象的初始化是在相应的类被加载(解析)时,与 Java 静态初始化器的语义相匹配
继承,覆盖
委托
声明格式:by XXX
XXX将会在类内部存储
编译器将生成转发给XXX所有的成员函数
Java中的泛型不型变:List 非 List 子类型
声明处型变
out 型变注解
in
类型投影
类型擦除:运行时泛型实例不保留类型实参任何信息
类型安全检测:仅在编译期进行
多态
抽象方法:abstract fun name( ) 无实现
抽象属性 abstract val name:String 不能初始化,子类必须初始化
特性:不能创建对象,子类必须实现抽象方法
声明:data class (var a,var b . . .)
编译器隐含:equals,hascode,toString
特性:至少一个参数,必须标val var ,可继承,可实现接口
解构声明:所定义的属性,自动生成ComponentN()一一对应
copy() : 修改类属性
package oop
data class DataClass(
var weight:Double,
var age:Int,
var name:String
)
fun main(args:Array<String>) {
val people1 = DataClass(60.0,22,"yerongrong")
val people2 = DataClass(65.0,22,"yerongrong.genius")
if(people1.equals(people2)) {
println("people1 = people2")
}else {
println("people1 = people2")
}
println("${people1.age},${people1.name},${people1.weight}")
people1.copy(age = 5)
println("${people1.age},${people1.name},${people1.weight}")
val (w,a,n) = people1
println("$w,$a,$n")
}
/**
* 1. 上面说明了数据类的声明格式
* dataclass
*
* 2. 另外包括了一些高级用法
* copy()函数
* val (w,a,n) = people1 声明属性格式
* equals 原生对比方法
*/
字符串String
特性: 支持[ ] 随机访问
fun 分类
index :indexof() 查找元素对应的下标(默认匹配第一个)
子串sub:
subsequence: startIndex参数:截取字符串的开始下标,endIndex参数:截取字符串的结束下标,rang参数,是指一个IntRang类型
附加:after,before,last
filter过滤:s.filter { 过滤的条件 }
转换:toXXX 转换成指定类型 如大整数,byteArray
replace: 替换串中的某部分,可指定条件
replace(XXX,XXX,ignoreCase = false) regex: 指定正则表达
replaceXXX: range 指定范围,after,before,first
分割split
正则 Kotlin:regex Java: pattern
以delimiters作为分割符:将string分为多个sub串
特性:List 是一个有序集合,可通过索引(反映元素位置的整数)访问元素。元素可以在 list 中出现多次
特性:Set 是唯一元素的集合。它反映了集合(set)的数学抽象:一组无重复的对象。
共有
继承自同父类相同的属性&方法:Collection
常用方法
循环 foreach
过滤 filter
接口:即一种约定,不能有状态
声明: interface name { }
方法:只能存在public abstract 方法,允许方法有默认实现
属性
类可以嵌套在其它类内部
标记为 inner 的嵌套类能够访问其外部类的成员
声明:enum class name { }
枚举常量:即枚举类的对象,0-多个,以逗号分隔
特性
name(枚举常量名)&& ordinal (枚举常量位置)
默认实现了companion object {},无需实例化
访问:valueOf( ) values( ) 和enumValues() enumValueOf()
密封类:不能被实例化,用来表示受限的类继承结构
声明:sealed class SealedExpr( )
特性
有限的代码保护
子类只能声明在本文件内
密封类的一个子类可以有可包含状态的多个实例
注解是一种类型 : 相当于对于某些代码个体的标签,用于评价与解释
定义:public @interface TestAnnotation { }
应用:@TestAnnotation public class Test { }
元注解:注解的注解 @Retention、@Documented、@Target、@Inherited、@Repeatable 5种
注解通过反射获取
注解只有属性,即成员变量
提供信息给编译器
编译阶段时的处理
运行时的处理