Kotlin从入门到精通 | 第四章 类型初步
本章节主要介绍Kotlin的类型定义和简单使用
类的定义
Kotlin类默认为public,类内无内容可省略
Kotlin类成员变量,方法同Java类似
Kotlin类默认带无参构造器,如果需要定义其他构造器,使用constructor
关键字创建
也可以直接定义到类上
类的实例化
直观感受是,省略了
new
关键字,获得对象再也不需要new
了
Java
1 | SimpleClass simpleClass = new SimpleClass(9); |
Kotlin
1 | val simpleClass = SimpleClass(9) |
接口的定义
基本和Java一致
接口的实现
implements
关键字换成了:
@override
注解换成了override
关键字
抽象类的定义
由于Kotlin的类默认是final,所以需要添加open关键字,使之可以被继承
类的继承
extends
关键字换成了:
,跟接口实现保持了一致- 需要调用被继承方的构造器(默认为无参构造器)
类的属性(成员变量)
- var:默认带
getter
和setter
- val:默认带
getter
也可以自己定义getter
和setter
方法
1 | class Person(age: Int, name: String) { |
属性引用
1 | fun main() { |
接口属性
接口可以定义属性,但是不能赋值
1 | interface Guy { |
接口属性没有backing field
我们尝试跟上面的类一样定义getter
和setter
方法
1 | interface Guy { |
将会获得编译器提示”Property in an interface cannot have a backing field”
扩展方法
这是Kotlin的大杀器,非常好用,一些工具类完全可以用扩展方法来替代,并且使用起来非常方便
可以为现存的类定义新的方法
1 | operator fun String.minus(right: Any?) = this.replaceFirst(right.toString(), "") |
空指针安全特性
空类型安全
注意:String和String?不是一个类型
1 | var nonNull: String = "Hello" |
强转为不可空类型
1 | var nullable: String? = "Hello" |
安全访问
1 | var nullable: String? = "Hello" |
?.
的语法结构,我最早是在TypeScript里面看到的,基本逻辑就是,如果为空,则不会继续往下执行,一定程度上杜绝了NPE异常,而现在Kotlin把它引入了,非常棒
elvis运算符(?:)
1 | var nullable: String? = "Hello" |
nullable == null
时,length = 0nullable != null
时,length = nullable!!.length
平台类型
Kotlin对于Java类库,是百分百支持的,但是Java里面没有String?
这种类型,Kotlin怎么处理呢?是当成非空还是可空类型?
答案是:Kotlin编译器不判断,有用户自己来判断是否可空还是非空
比如在Java里面定义了一个Person
1 | public class Person { |
那么在Kotlin里面调用时,person.title
的类型是String!
,这个String!
就是平台类型,可以非空也可以可空
1 | val person = Person() |
智能类型转换
自动转换为子类型
1 | val kotliner: Kotliner = Person("benny", 20) // Person是Kotliner的子类 |
可空转非空
1 | var value: String? = null |
不支持智能类型转换的场景
在线程不安全的调用下,智能类型转换失效
1 | var tag: String? = null |
类型的安全转换(as?)
1 | val kotliner: Kotliner = ... |
针对类型的智能转换,有几个建议
- 尽可能使用val来声明不可变引用,让程序的含义更加清晰确定
- 尽可能减少函数对外部变量的访问,也为函数式编程提供基础(函数式编程的精髓就是拒绝副作用)
- 必要时创建局部变量指向外部变量,避免因它变化引起程序错误
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 观沧海!
评论