Kotlin基础——类和继承

时间:2021-04-18 16:10:53

1.类的创建

插件安装好之后可以直接通过菜单像创建java类一样进行kotlin类的创建
Kotlin基础——类和继承

Kotlin基础——类和继承

经过上面的两次点击我们可以得到如下的类:

class Test {
}

和java看不出任何区别:class 关键字,类名,大括号包裹的类主体。

2.构造函数

与java的构造函数不同的是,kotlin的构造函数分为主构造函数和二级构造函数。

2.1主构造函数

主构造函数是类头(大括号前)的一部分,跟在类名的后面。且构造函数用constructor关键字修饰,如下所示:

class Test constructor(name: String) {

}

constructor可以省略,即:

class Test (name: String) {

}

主构造函数参数为空时可以省略,就想我们刚创建的时候那样

当我们在主构造函数中声明的变量怎么使用呢?这个变量并不能在类头中进行使用,需要在类体中定义一段init(关键字)声明的代码段中使用,而init代码段也无需再对变量进行声明:

class Test constructor(name: String) {
init {
Log.e("Test",name)
}


}

也可以在类的属性初始化处使用

class Test constructor(name: String) {
var myName = name.toUpperCase()
}

属性声明并在主构造函数中初始化可以写成

class Test constructor(val name: String,var age:Int) {

}

同样,属性可以是var和val

在主构造函数中为属性设置默认值

class Test constructor(val name: String,var age:Int,var sex:String="男") {

}

在java我们的构造函数是可以有访问修饰符修饰的,kotlin中也是可以的,但这时候的constructor就不能省略了

class Test public constructor(val name: String,var age:Int) {

}

如果主构造函数中最后若干个字段都设置了默认值,那么这些字段可以省略最后面的若干个(有些书上说如果主构造函数中所有的字段都设置了默认值,那么会生成一个空参的构造函数,这种说法我持保留意见)

class TestA constructor(var name: String = "fullCat", var age: Int = 18) {
init {
Log.e("TestA", "name is " + name + ",age is " + age)
}

}
class TestB {
fun fun1() {
var testA1: TestA = TestA() //正确
var testA2: TestA = TestA("maoMao") //正确
var testA3: TestA = TestA(18) //错误
var testA4: TestA = TestA("maoMao", 18) //正确
}
}

我们修改一下TestA的主构造函数:

class TestA constructor(var name: String = "fullCat", var age: Int) {
init {
Log.e("TestA", "name is " + name + ",age is " + age)
}

}
   var testA3: TestA = TestA(18)       //错误

testA3这种构造依旧错误,因此,我们只能省略最后面的字段

2.2二级构造函数

如果类有主构造函数,每个二级构造函数都要,或直接或间接通过另一个二级构造
函数代理主构造函数。在同一个类中代理另一个构造函数使用 this 关键字:

class Test constructor(val name: String) {
init {
Log.e("Test", "name is" + name)
}

//直接代理主构造函数
constructor(name: String, age: Int) :
this(name) {
Log.e("Test", "age is" + age)
}

//间接通过另一个二级构造函数代理主构造函数
constructor(name: String, age: Int, sex: String) : this(name, age) {
Log.e("Test", "sex is" + sex)
}

}

如果一个非抽象类没有声明构造函数(主构造函数或二级构造函数),它会产生一个没有参数的构造函数。构造函数是 public 。如果想让该类的构造函数私有,就得声明一个空的主构造函数:

class TestA private constructor() {

}

3.继承

与java不同,kotlin公共父类并不是Object而是Any,Any 不是 java.lang.Object ;事实上它除了 equals() , hashCode() 以
及 toString() 外没有任何成员了。kotlin中继承的书写格式如下:

open class Father {
}
class Son : Father() {
}

kotlin中创建的类默认是final的,如果我们希望一个类可以被继承,那么需要用open(kotlin的关键字)进行修饰。

如果子类有主构造函数,则父类可以而且是必须在子类主构造函数中立即初始化,父类的构造可以为主构造也可以为二级构造

open class Father(name: String) {

}
class Son(name: String) : Father(name) {

}

如果类没有主构造函数,则必须在每一个构造函数中用 super 关键字初始化基类,或者在代理另一个构造函数做这件事

 constructor(name: String) : super(name)