Kotlin 学习2

Kotlin 学习2

官方文档

官方文档

官方中文

kotlin语法与Java的不同

22. 引用java或自定义的函数或变量与kotlin关键字相同是,用两个 ` 包起来

//  如果 in 为java的一个函数, 定义如下
// class  A{
// 	void in();
//  }
x = A()
x.`in`()    // in 是kotlin关键字

kotling关键字:

关键字 说明
abstract 抽象声明,被标注对象默认是open
annotation 注解声明
by 类委托、属性委托
class 声明类
companion 伴生对象声明
const 声明编译期常量
constructor 声明构造函数
crossinline 标记内联函数的lambda表达式参数,标识该lambda函数返回为非局部返回,不允许非局部控制流
data 数据类,声明的类默认实现equals()/hashCode()/toString/copy()/componentN()
enum 声明枚举类
field 属性的幕后字段
fun 声明函数
import 导入
in 修饰类型参数,使其逆变:只可以被消费而不可以被生产
init 初始化块;相当于主构造函数的方法体
inline 声明内联函数
inner 标记嵌套类,使其成为内部类:可访问外部类的成员
interface 声明接口
internal 可见性修饰符,相同模块内可见
lateinit 延迟初始化,避免空检查
noinline 禁用内联,标记内联函数不需要内联的参数
object 对象表达式、对象声明
open 允许其它类继承;kotlin类默认都是final,禁止继承
operator 标记重载操作符的函数
out 修饰类型参数,使其协变:只可以被生产而不可以被消费
override 标注复写的方法、属性
package 包声明
private 可见性修饰符,文件内可见
protected 可见性声明,只修饰类成员,子类中可见
public kotlin默认的可见性修饰符,随处可见
reified 限定类型参数,需要配合inline关键字使用
sealed 声明密封类,功能类似枚举
super 访问超类的方法、属性
suspend 声明挂起函数,该函数只能从协程和其他挂起函数中调用
throw 抛异常
typealias 声明类型别名
val 声明只读属性
var 声明可变属性
vararg 修饰函数参数:声明为可变数量参数

23. 强制类型转换用 asas?

x: A = y as A      		//将y强转为 A 类型
x: A? = y as? A		//将y强转为 A 类型, 转换失败可为 null 

24. import 两个类名相同,包名不同的类,可以设置别名, 用 as

import xxx.xxx.A
import yyy.yyy.A  as  YA   //为避免与 xxx.xxx.A冲突,引进别名

x = A()     // == xxx.xxx.A()
y = YA()   //使用别名创建对象, ==  yyy.yyy.A()

25. 任何类型都可以设置别名

typealias  A = ABCDEFG        //类别太长,设置个短的别名
x = A()   

26. 用 is 可判断对象的实际类型,一旦判断成功,可以不用强转,直接使用该类型方法

class ABC {
	fun abc() { }
}

val x: Any  = ABC()
x.abc()		//error, x是Any类型,没有 abc() 方法

if( x is ABC ) {
	x.abc()    // OK ,已经知道 x 就是 ABC 类型
}

27. 类和函数,属性定义不加 open ,默认是不可继承的

28. in 运算判断元素是否在集合中, .. 运算表示一个范围, !in 运算判断元素不在集合中

x in 1 .. 9      // x = 1 到 9 的任何Int 就返回 true

for( y in 0 .. 100) {
	println(y)      //循环0到100, 打印
}

29. 函数支持可变参数,可变参数数量不定, 不再支持java 的 new Int[] { 1,2,3 ...} 这样的不定参数初始化

var x = arrayOf(1,2,3)      // 数组 [ 1, 2, 3 ]
x = arrayOf(1,2,3,4,5)      // 数组 [ 1, 2, 3, 4, 5 ]

不定参数定义

fun f1( vararg  ls: Int) {
	for ( x in ls ) {
		println("${x} , ")
	}
}

f1(1,2,3)     // 输出 1 , 2 , 3 ,
f1(1,2,3,4,5)     // 输出 1 , 2 , 3 , 4 , 5 , 

30. internal 修饰的类,函数,属性,变量,在同一模块(如打包成同一给 jar 文件的代码属于同一个模块)是全局 public的,但是到了模块外,就是 private 的,不可调用,这样可以保护一些内部敏感函数不被外界调用

猜你喜欢

转载自my.oschina.net/u/181909/blog/1795467