类定义
Kotlin中的类遵循一个简单的结构,如果你需要定义一个类,使用class关键字就可以了.
class User {
var email: String? = null
var name: String? = null
}
当然若是一个空类,可以直接省略大括号
class User {
}
构造方法
Kotlin中的构造方法可以分为主要构造方法和二级构造方法,主要构造方法作为类声明的一部分。构造方法的关键字为constructor,如果主要构造方法没有注解或可见度修饰符,此关键字可以省略。和Java中的类一样,每个类都有一个唯一默认的主要构造方法,不带任何参数
class User {
}
在需要的地方,我们可以定义一个对象并使用默认的构造函器去初始化:
var user : User = User()
//user可为null
var user: User? = null
大部分情况下我们只需要使用这个默认的构造方法,当然我们也可以创建带参数的主要构造方法,然后再init中去做我们想做的事情
class User(name: String, emaile: String) {
var email: String? = null
var name: String? = null
var id: Int = 0
init {
this.email = email
this.name = name
}
}
然后再需要使用的地方直接创建对象
var uset: User = User("LBJFAN", "1057817946@qq.com")
打印结果:
MainActivity: name:LBJFAN:email:1057817946@qq.com
二级构造方法
当主要构造方法无参时,我们可以
constructor(name:String,email: String){
this.name = name
this.email = email
}
当主要构造方法有参数,则二级构造方法必须调用主要构造方法
class User(name: String) {
constructor(name: String, email: String):this(name) {
this.name = name
this.email = email
}
类继承
Kotlin中默认任何类都是继承自 Any (与java中的 Object 类似),但是我们可以继
承其它类。所有的类默认都是不可继承的(final),所以我们只能继承那些明确声
明 open 或者 abstract 的类
open class User(name: String)
class Student(name: String, surname: String) : User(name)
如果父类没有主要构造方法,但是有二级构造方法,则子类必须初始化父类的二级构造方法,使用super关键字
open class User {
constructor(name: String, email: String){
this.name = name
this.email = email
}
}
class Student : User {
constructor(name: String, email: String) : super(name, email)
}
重写
父类中的方法使用open关键字可以被重写,子类中须使用override关键字,父类中使用final关键字,该方法不能被子类重写
User类中定义方法
open fun printUserInfo(){
}
Student类中
override fun printUserInfo(){
}
User类中定义方法
final fun setUserName(){
}
该方法不能被重写
kotlin是单继承的,但是可以实现多个接口。而且接口中可以有默认的实现方法。在子类中调用父类的方法是,可以直接用super关键字,但如果父类中的方法名一样,则必须志明调用哪个父类的方法,用关键字super<父类名>,如:
interface A {
fun printUserInfo() {}
}
open class B {
open fun printUserInfo() {
}
}
class C : B(), A {
override fun printUserInfo() {
super<A>.printUserInfo()
}
}
抽象类
kotlin中的抽象类也用关键字abstract,如果一个方法定义成了abstract,则这个类也必须是abstract。这时候这个方法没有必要用open关键字,因为这个方法一定是会被子类重写的。
abstract class A {
abstract fun f()
}
class B : A() {
override fun f() {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
}