Kotlin 主要知识点概况

认识Kotlin

Java && Kotlin 区别

几个观念

Kotlin -> “更好的Java”
Java和kotlin平行关系,最终都翻译为Class文件
Kotlin 主要知识点概况_第1张图片

几个问题点

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


基础语法

基本数据类型

  • float:f,F后缀
  • 布尔:Boolean(true,false)
  • 数组 array 创建 arrayOf
  • 字符:char 不能直接与数字操作,char必须是单引号 如:‘a’
  • 字符串String:$ 字符串模式引用变量或者表达式
    特性
    装箱机制 :kotlin 内置类型 -> JVM原生类型
    其它(可空引用,泛型) -> 自动装箱成相应的包装类

    == && === 类型相等性

变量,属性,字段

  • 属性:str.length 为什么没有( )(最直观的理解)有函数的意味在里面
    val 不可变 only getter
    var 可变 getter 和 setter
    特性:可执行默认初始化
  • 委托属性
    声明:val/var : by
    延迟属性(lazy properties): 其值只在首次访问时计算
  • 懒加载属性
    prop$delegate 属性:自动生成,并复写prop的setter和getter方法
    可观察属性(observable properties): 监听器会收到有关此属性变更的通知
    storing:把多个属性储存在一个映射(map)中,而不是每个存在单独的字段中
  • 使用场景:被模型的属性全部委托到map的结构去真实存储数据
    用于解析json,或者做一些动态的事情
    变量
    字段

程序结构

  • 循环
    for( it in collection ) { //对象需提供迭代器 }
    提供下标 for ( index in collection.indices)
    while && do…while
    跳转key:return ,break,continue
  • 判断
    if … else
    when(x) { } : 相当于switch case x
  • 类型声明
    类型推导/转换
    toByte(): Byte toShort(): Short toInt(): Int toLong(): Long toFloat(): Float toDouble(): Double toChar(): Char

Java & kotlin 相互调用

方法调用

Java返回void - kotlin返回Unit

获取对象的引用:val c = myObj::class
关键字:kotlin - Java ‘’转义
注解
@JvmName:包级属性和函数
@JvmField:kotlin属性 - Java 中的一个域
@JvmStatic:kotlin - Java 生成静态方法

属性

Java setter & getter 方法 - kotlin 属性
类型系统
空安全 & 平台类型
映射类型:Java 映射到对应的 kotlin类型
映射发生在编译期间,运行时表示保存不变

kotlin fun

fun 那些事儿

  • 扩展函数:在类体外定义 class. fun name( ) :returnValue { this -> 代指 调用的对象 }
  • 接受器类型:任何扩展类&接口 接受器对象:扩展函数的值
  • 标准库扩展函数
    run
    let
    also
    takeif
    内联函数 inline
    顶层函数
  • 理解
  1. kotlin 我理解为定义在类体外的
  2. C++ 全局函数
  3. Java 的静态函数 Kt->Java 创建一个类(类名即文件名),+public static 修饰方法

lambda

表达式:{ a,b -> a+b} 参数类型,返回值类型

key含义

this 代表调用函数的对象
it 指的是iterator 只有一个参数时可默认为it

函数式编程

定义:输入(引数)— 输出(传出值)编程范式
特性
函数即输入与输出的关系,不关心过程,只重结果
stateless:函数不维护任何状态
immutable:输入数据不能动,返回新的数据集
lambda 最少样板代码传递代码块
lambda = 匿名函数

高阶函数:使用函数对象作为参数或返回值

fun 链式调用 (funA().funB():相应funA的返回值去调用funB)
函数式操作
filter 筛选
map 映射
reduce 归约
groupBy 分组

面向对象

构造方法

主:
从:声明在类体内以 constructor 关键字
特性:
必须带constructor
次构造函数都需要用 this 关键字直接或间接委托给主构造函数
访问控制: 权限修饰 public,private,protected

伴生对象:static到object

初始化:伴生对象的初始化是在相应的类被加载(解析)时,与 Java 静态初始化器的语义相匹配
继承,覆盖
委托
声明格式:by XXX
XXX将会在类内部存储
编译器将生成转发给XXX所有的成员函数

泛型

Java中的泛型不型变:List 非 List 子类型
声明处型变
out 型变注解
in
类型投影
类型擦除:运行时泛型实例不保留类型实参任何信息
类型安全检测:仅在编译期进行
多态

kotlin class 六大类型

抽象类

抽象方法: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

字符串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 是一个有序集合,可通过索引(反映元素位置的整数)访问元素。元素可以在 list 中出现多次

  • 常用fun
    创建 listof(),mutablelistof() 可读写,listofnotnull () 非空的
    类似于其它容器

set

特性:Set 是唯一元素的集合。它反映了集合(set)的数学抽象:一组无重复的对象。

  • 常用fun
    创建 setof(),mutablesetof() 可读写,sortedsetof() 排序的
    元素操作:add,remove,clear(清空),isEmpty 判空,size 大小
    排序:sortXXX
    split分割
    filter过滤
    循环foreach
    max / min
    index
    groupby分组

map

  • 特性:Map(或者字典)是一组键值对。键是唯一的,每个键都刚好映射到一个值。值可以重复。逻辑连接
    常用fun
    创建mapof(x to x,xx to xx), mutableMapOf()可读写,sortedmapof() 排序的
    plus

关于集合

共有
继承自同父类相同的属性&方法: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种

特性

注解通过反射获取
注解只有属性,即成员变量
提供信息给编译器
编译阶段时的处理
运行时的处理

kotlin高级

设计原则

  • 开发封闭原则
    含义:软件实体可以扩展,但是不可以修改
    应用
  • 类扩展
  • 设计模式
    工厂模式
    伴生对象
    内联函数
    响应式编程
    并发
    同步与异步
    多线程

你可能感兴趣的:(Kotlin)