第五讲 类定义与继承
面向对象开发,最重要的就是定义一个类。Java 的世界中存在很多类(内部类丶匿名内部类丶静态类丶枚举类等),Kotlin也存在这些类,只是在定义的有些许不同,并增加了一些特有的类(密封类 丶 data类等)。接下来让我们来看看这些类如何定义,以及其功能。
定义一个类
Java 类只能定义在一个与类同名的
.java
文件中(先不考虑内部类)。Kotlin 中你可以不这样做了。你可以在同一个
.kt
文件里定义多个类。
package com.qihoo.kot
class DemoClass
复制代码
Kotlin 定义一个类就是这么简单,但是这个类没有任何意义。需要注意的是:Ktolin 默认定义的类都是
public final
类型的(Kolin 也不使用这 2 个关键词了)。
我们都知道 Java 创建一个对象都需要调用其类的构造函数。Kotlin 也具有这个特点,只是构造函数的定义上存在一些区别。
主构造函数
Java 所有的类都会一个默认隐藏的无参构造函数。Kotlin 与之对应的函数,称之为
主构造函数
,Kotlin 的主构造函数默认也是隐藏的,但是主构造函数可以定义参数的。
次构造函数
既然存在主构造函数,那么就会存在次构造函数。Kotlin 的次级构造函数,类似于 Java 的构造函数重载,不同的是 Kotlin 的次级构造函数,一定要与主构造函数关联。定义一个次级构造函数使用
constructor
定义方法即可。
构造函数 init 方法
曾几何时,Java 中我们经常自定义 View,需要重写 N 个构造函数,然后每个函数都要调用 init 方法。做一些初始化画笔等功能。在 Kotlin 中 init 方法具有类似的功能,在调用构造函数之后会调用(有点类似构造代码块)。
class Empty(name: String, age: Int) {
init {
println("对象创建:$name $age ")
* 也可以定义多个 init 方法,执行顺序从上到下
init {
println("对象创建22:$name $age")
复制代码
构造函数修饰符
还记得 Java 中单利吗?第一件事就是私有化无参的隐藏构造函数。Kotlin 对应的就是私有化主构造函数了。
* 构造方法权限符修饰 class DemoClass private constructor ( ){ * 也可以 私有化次构造函数 private constructor ( name: String , age: Int ) : this ( ) {补充一个小点,不然后面的继承有点知识盲点。如果定义了次级构造函数且主构造函数没有明确指定(默认使用隐藏的主构造函数),那么次级构造函数无需做主构造函数的关联。
* Empty 类的主构造函数没有被重新定义 open class Empty { * 可以发现 次构造函数可以,省略不写 :this() constructor (name: String ) 复制代码类函数
既然讲了如何通过定义构造函数定义了类,那么定义类的属性和函数是必不可少的了。其实定义的次构造函数也是函数(Kotlin 中的函数,会分一个大章节来详细讲解)。定义函数需要使用
fun
修饰符来修饰,默认定义的函数都是
public final
。
open class Empty {
* 定义 call 函数,并定义行参 type
fun call(type: Int) {
复制代码
类属性
还记得 Java 中,构造函数中为类的成员变量赋值的写法吗?
public class Empty {
private final int name;
private final int age;
public Empty(String name, int age) {
this.name = age;
this.age = age;
复制代码
来看看 Kotlin 的简单写法!我们只需要在主构造函数中,使用
val
或
var
修饰符修饰变量,对应的变量就会变成类的成员变量了(此功能只能使用在主构造函数中)。
open class Empty(val name: String, val age: Int)
复制代码
当然我们也可以定义其他的成员变量。
open class Empty(val name: String, val age: Int){
val sex: String = "男"
复制代码
继承
前面说过 Kotlin 的默认定义的 class 是默认 final 类型的,也就是不可以继承。如果要继承必须使用 open 符修饰。Kotlin 中的继承不再像 Java 使用 extends 而是替换成了
:
。
* open 修饰
open
class
A
(val name:
String
)
* B 继承 A 类,中间用 :
class
B
(name:
String
)
: A(name)
复制代码
重写属性和方法
Java 的世界中,只存在重写方法。但是 Kotlin 是可以重写属性&重写方法,只需要用 override 修饰即可。
* open修饰 open class A { // value 记得 open open val value = 0 * B继承A类 class B : A () { // 覆盖A的 value 值,要用 override override val value = 1 复制代码重写方法:
* B 继承 A 类 class B : A () { // 覆盖A的value值 override val value = 1 override fun test () { super .test() // 若要获取父类的属性 通过 super关键词 val superValue = super .value println( "父类的 $superValue " ) 复制代码 Taonce