基本语法 or 与Java的基本区别
更新: 6/24/2025 字数: 0 字 时长: 0 分钟
放弃基本对象
Alibaba代码指南对基本类型和对象之间有很多规定,简单的来说可以认为”除了局部变量,其他变量/字段均使用对象“
而在Kotlin中,万物皆对象,Kotlin舍弃了基本类型,全部使用对象。
(我知道你可能会问性能降低了怎么办?在一些情况,Kotlin编译时会将基本类型的对象转化成Java的基本数据类型)
这无疑是对程序员有利的,我们不用再去思考什么时候使用基本类型,什么时候使用包装类型。
空安全
由于Java的NullPointerException出现的过于频繁,Kotlin在设计之初特别对空安全做了限制,Kotlin特备区分了可空类和不可空类
var str:String="213"
val strOrNull:String=null
var str=null //报错,提示String不可为空
原始的空在业务中是无意义的,他的意义只由业务赋予
放宽面向对象的限制
我喜欢将Java称作完全面向对象的语言,因为Java中你的每一个操作都是在对象中完成,即时程序员早期在写java代码的时候还是面向过程的,但Java的面向对象思想/语法会不断的引导程序员走向面相对象的道路。
这对于初级程序员无疑是极好的,但是当我们写了大量的Java代码后就会发现Java的“强制”面向对象会成为一种负担,比如这样
System.out.println(new Scanner().nextLine())
上面是Java的读入一行文字并将其输出的代码,我们会发现这实在是太过复杂了,而论其原因,无非是强制面向对象导致,我们必须要将读写两个不同的操作放在两个职责不同的类中,而使用这两个操作必须又通过这两个类
而Kotlin通过其自身的inline语法,允许一些方法被直接调用
println(readln())
可以返回值的判断语句
在Kotlin中允许if与when(Java中的switch)返回一个值
val c=if(true) 1 else 2
val c=when (a) {
1 -> println("a = 1")
2 -> println("a = 2")
else -> println("a != 1 && a != 2")
}
也是由于这种语法,Kotlin去除了三目表达式,推荐程序员使用if-else语法作为代替
特别的返回方式
Kotlin允许代码块中的最后一行的值内容作为返回值,也就是说如果代码块中的最后一行是一个值,那么这个值将会作为这个代码块的返回值,这一点在上面的if-else中也可见得(没有使用return却将一个值传出了if-else的范围)
val c=if(true){
//此处省略一万行操作....
1*1
}eles{
//此处省略一万行操作....
1+1
}
更好的switch—when
作为在Kotlin中switch的替代品,when拿出了比Kotlin更好的语法特性。
逻辑判断
val message = when {
a > b -> "a is greater than b"
a < b -> "a is less than b"
else -> "a is equal to b"
}
多个条件的组合
when (x) {
0, 1 -> print("x == 0 or x == 1")
else -> print("otherwise")
}
范围的选择
when (x) {
in 1..10 -> print("x is in the range")
in validNumbers -> print("x is valid")
!in 10..20 -> print("x is outside the range")
else -> print("none of the above")
}
可以说,只要是一个完全的逻辑,你就可以在when中使用
特别的,when支持一种没有主语的写法
val a=when{
false ->1
true ->2
false ->3
else ->3
}
这种写法与if-else的写法一致,会选择从上到下第一个为true的方法执行,但是并不推荐使用
更好的范围
Kotlin对区间内的数据提供了更好的支持,现在我们可以这样写一个区间
for(i in 1..5){ //1到5的左右闭区间
}
1..<5 //不要5了
1..5 step 2//一次移动俩
5 downTo 1 step 2 //从5到1 一次移动俩
标签
Kotlin允许我们文一个表达式添加标签
loop@ for(i in 5 downTo 1 step 2){
}
同时Kotlin还允许continue,break,return到指定的标签处
for (x in 1..5){
loop@ for(y in 5 downTo 1){
if(y==3){
break@loop
}
println("(${x},${y})")
}
}
//这段代码返回
//(1,5)
//(1,4)
//(2,5)
//(2,4)
//(3,5)
//(3,4)
//(4,5)
//(4,4)
//(5,5)
//(5,4)
更好的异常捕获机制
在Java中,编译器强制我们对每一个异常进行处理,但是我们会发现大多数的情况我们只是在不断的上抛或者是打个标签,甚至遇见的最多的情况还是同一个异常——NullPointerException。
于是Kotlin删除了强制处理异常的极致,现在即时方法会抛出异常,你也不必要对他加上try-catch语句。
但try-catch语句仍然被保留在Kotlin中,因为对异常的预测和处理仍然是被开发者需要的,他只是不必须了,但仍然存在。
与if/when相同的是,try-catch也支持返回值,你可以这样写一段代码
val a=try{
//一些代码
1
}catch(e:Exception){
log.erro("...")
}
Nothing类
除了Any这种顶类外,Kotlin还存在一个底类——Nothing,他是所有类的子类,这使得我们可以将Nothing类作为任何类的实现
当内容没有正常返回(比如发生了异常),那么我们可以使用Nothing作为方法的接受值
fun fail(message: String): Nothing {
throw IllegalArgumentException(message)、
}
data class Person(val name: String?)
fun main() {
val person = Person(name = null)
val s: String = person.name ?: fail("Name required")
println(s)
}
这里简单解释一下他的操作:由于没有正常的返回内容,因此fail方法可以用Nothing作为返回值,又由于String的底类是Nothing,所以可以将String和Nothing一起作为String类型的返回值