- 在java中,我们在声明一个变量时,需要将变量类型放在变量名前面,而kotlin正好相反,变量名在前,变量类型在后。
// java
String a= "i ma java"
// kotlin
val a: String ="i am kotlin"
增强的类型推到。
编译器可以在不知道显示声明的基础类型下,自动推到出它所需要的类型。
val string="i am Kotlin"
val int =0
val float=1.0f
val long=1314L
val double=5.12
类型转换
只能进行强转换
val e: Int=10
val f:Long=e.toLong()
val 和var 的使用规则。
- 如果说var代表了varible,那么val代表的是value的缩写。但是这样表述不准确,而是把val解释成final+ varible,即通过val声明的变量具有java中final关键字的效果。也就是引用不可变。
- val的含义:引用不可变。个人认为:和java中的final关键字类似,保证内存地址不变,但是对象内容是可以变的。
class Book(var name:String){
fun printName(){
println(this.name)
}
}
fun main(args:Array<String>){
val book=Book("thinking in java")
book.name="Diviing into Kotlin"
book.printName()
}
字符串的比较
- "=="比较的是内容
- "==="比较的是引用
方法和成员变量的引用
通过两个冒号::
来实现对于某个类的方法进行引用,加入我们有一个CountryTest类的对象实例,countryTest,如果要引用他的isBigEuropeanCuountry方法:
countryTest::isBigEuropeanCountry
when表达式和for循环和范围表达式
fun schedule(cunny:boolean,day:Day)=when (day){
DAY>SAT->basketball()
DAY->SUN->fishing()
DAY.FRI->appointment()
else->when{
sunny->library()
else->study();
}
}
表达式的具体语法
- 一个完整的when表达式类似switch语句,由when关键字开始,用花括号包含多个分支,每个分支有->链接。一直匹配完为止,否则执行else分支的内容。
for 循环和范围表达式。
for(i:int in 1…10){
println(i)
}
- in 1…10 是范围表达式,表述出范围
- 。
function类型和invoke方法
fun foo(int:Int){
print(int)
}
fun main(){
listOf(1,2,3).forEach{foo(it)}
}
其java的反编译代码为:
public static final Function0 foo(final int var0){
return (Functino0)(new function0(){
public Object invoke(){
this.invoke();
return Unit.INSTANCE;
}
public final void invoke(){
int var1=var0;
sout(var1);
}
});
Kotlin在JVM层设计了function类型(Function0,Function1,Function2,Function…Function22)来兼容java的lambda表达式,其中后缀数字代表了lambda参数的数量.
invoke方法
在上面代码中,foo函数的返回值类型是Function0,这就意味着,我们调用了foo(n),那么实际上是构造了一个function对象,这个对象并不等价与我们要调用的过程本身,需要调用Functin0的invoke方法才能执行println方法。
因此可以改以上代码为:
fun main(){
listOf(1,2,3).forEach{foo(it).invoke()}
}
或者
fun main(){
listOf(1,2,3).forEach{foo(it).()}
}
非空判断
- 安全的调用:
?.
, - Elvis操作符 类似于java的?
double result=student.glasses!=null?student.glass.degree:-1
val result=student.glasses?.degreeOfMyopia?:-1
- 非空断言!!.
在java中,用Assert来保证某个变量不为空,Kotlin中,提供!!.
fun main(args:Array<String>){
var b1:Boolean=true
}
插入到字符串中:"${b1}代表真"