val 常量声明
val MODE_STORE: Int? = 0
var 变量声明
var return: Int? = 0
?的含义:在kotlin中单独使用?表示可以为空
var result = str?.length
等同于java:
if(str == null){
// 这里result为一个引用类型
result = null;
} else{
// 这里result为Int
result = str.length;
}
!!的含义:在kotlin中表示一定不能为空
business.product!!.id!!
?:的含义:在kotlin中表示三元操作符,既三目运算符
var str : String? = null
var result = str?.length ?: -1
var result : Int = if(str != null) str.length else -1
kotlin中泛型
kotlin中添加了协变注解修饰符:in和out(in对应to,out对应from)
in T:来确保Source的成员函数只能消费T类型,而不能返回T类型,也称in修饰的参数为“消费者”
out R:来确保Source的成员函数只能返回R类型,而不能消费R类型,也称out修饰的参数为“生产者”
out类似于java中的extends,用来界定类型上限,in类似于java中的super,用来界定类型下限。
//定义类
class Data<T>(var t : T)
//定义接口
interface Data<T>
//定义函数
fun <T> logic(t : T){}
//使用通配符解决数据调用问题
fun copy(from: Array<out A>, to: Array<in A>) {
for (i in from.indices)
to[i] = from[i]
}
JAVA中泛型
from是生产者,to是消费者。
extends关键字限定类型上限,super关键字限定类型下限。
//定义类
class Data<T>{}
//定义接口
interface Data<T>{}
//定义方法
public <T> void data(T t){}
//使用通配符
//用?表示任何类型,结合extends和super关键字可以限定类型的上限和下限
class Data<T>{}
// extends关键字限定类型上限,表示类型必须是String或String的子类
public void dataUpper(Data<? extends String> d){}
// super关键字限定类型下限,表示类型必须是String或String的父类
public void dataLower(Data<? super String> d){}
//使用通配符解决数据调用问题
fun copy(from: Array<A>, to: Array<A>) {
for (i in from.indices)
to[i] = from[i]
}
let 语法糖
let{}块
数据为空值,就return,退出函数
使用object关键字声明一个类型时,声明的是一个单例模式的类型。object是lazy-init,即延时初始化的,只有第一次使用时,才会加载并实例化它。
java中常有“按值传递”和“按引用传递”的概念。
kotlin中,函数入参一律是val,即常量类型。只读,不能修改。
在java和kotlin语言中,虽然没有指针的概念,但是变量名其实就是一个指针(非基本类型)。在jvm中,变量名会被处理成指向某个内存地址的值。