1.类的创建
插件安装好之后可以直接通过菜单像创建java类一样进行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)