2024年Kotlin学习(3)可空类型和类型系统,搜狐新闻客户端android面试题
最后
由于题目很多整理答案的工作量太大,所以仅限于提供知识点,详细的很多问题和参考答案我都整理成了 PDF文件



网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
另外,静态类型检查还可以提供有用的信息给编译器。
和Java相比,Kotlin去掉了原始类型,只有包装类型,编译器在编译阶段时,让编译器自己去优化性能,把包装类型拆箱成基本类型。
Kotlin引入了可空类型,把有可能为null的值单独用可空类型来表示,这样就可以在可空引用和不可空引用之间划分出一条明确的界限。
kotlin类型层次结构如图3-2所示:

可以看到,String、Int、MyClass继承了它们的非空类型,也就是说,他们是可以被装箱成 String?、Int?、MyClass?。同时在编译的时候,它们也是可以被拆箱成 string、int、myclass,存储的时候也会存到栈空间。
如果我们显示的定义了可空类型,就会大大降低在编译器在编译时或者运行时的空指针异常。
在kotlin中 ===判断指向的存储空间是否相同&&值是否相同,==判断值是否相同,举个例子:
//例子1:
val a:Int = 1000
val b:Int = 1000
a === b
true
a == b
true
//例子2:
val a:Int? = 1000
val b:Int? = 1000
a == b
true
a === b
flase
第一个例子中,a和b都是Int,在编译的时候拆箱成int, 值“1000”是存在栈空间中,并且它同时有 a、b两个引用,所以a和b指向的存储空间是相同的。
第二个例子中,a和b都是Int?,在编译的时候,会把它们看成是两个不同的对象,在堆中分配了不同的空间,所以它们指向的内存地址是不一样的。
Java中的数组的类型 T[](long[],int[]…}),而在Kotlin中,直接用Array类型表示数组,比如我们构造一个int数组,5个元素,每个元素的初始值为 i*i:
val squareArray = Array(5, {i -> i * i})
squareArray.forEach(::println)
0
1
4
9
16
Kotlin中对Java中8个基本类型数组用了 新的 xxxArray来定义。(比如 BooleanArray、ByteArray、DoubleArray…)
=========================================================================
Java中的用Optional中的orElse来判空,但是使用起来不美观。
Kotlin中使用了 ?.安全调用符,?:Elvis操作符。举一个例子:
fun main(args: Array){
println(getLength(null))
println(getLength(“hello”))
}
fun getLength(s: String?):Int{
return s?.length ?: 0 //如果s不为空,就返回 s.length,否则就返回0
}
==========================================================================
null的类型是 Nothing?
在Kotlin中,多使用 ?,就可以免去很多判空的操作:
val str:String = null //编译报错,因为String不能为空
var nullStr:String? = null //编译通过
null == null //返回true
null is Any //返回false
null is Any? //返回true
var a = null
a //输出null
a = 1 //编译报错,因为null的类型Nothing? 而1是Int,不能向上转型
我们不能用可空类型来直接调用它的属性或方法,例如下面代码直接报错:
nullStr.length //编译报错
nullStr?.length //要用安全调用符 ?. 编译才正确
!!非空断言使得可空类型对象可以调用成员方法或者属性:
nullStr = null
nullStr!!.lenth //如果nullStr为空,则抛出空指针异常
…Expection
=========================================================================
Kotlin中的Unit类型实现了和Java中void一样的功能
下面是Unit的定义
public object Unit{ //Unit类型是一个object对象类型
override fun toString() = “kotlin.Unit” //如果println输出对象类型,就是"kotlin.Unit"
}
当一个函数没有返回值的时候,我们就用Unit,并且不需要显示的返回Unit、或者声明一个函数的返回类型为Unit。
编译器会推断它,所以Unit对我们来说相当是缺省的。
在Java中,如果你想让一个函数返回值永远是null,那你可把函数的返回类型写成是 void的装箱类 Void,并返回null
而这个Void就对应Kolin中的Nothing?,其唯一可被访问的返回值也是null
在Kotlin系统类型中,Nothing是最底层,其构造函数时private的,说明其不能被实例化。
**如果一个函数的返回值是Nothing,这代表这个函数永远都不会有返回值。**和Java的void一样
我们可以在返回值为Nothing的函数去抛出异常
最后的最后
对于程序员来说,要学习的知识内容、技术有太多太多,要想不被环境淘汰就只有不断提升自己,从来都是我们去适应环境,而不是环境来适应我们!
当你有了学习线路,学习哪些内容,也知道以后的路怎么走了,理论看多了总要实践的

最后,互联网不存在所谓的寒冬,只是你没有努力罢了!
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
7M5G-1715691403068)]
最后,互联网不存在所谓的寒冬,只是你没有努力罢了!
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
更多推荐


所有评论(0)