Kotlin是基于Java的语言,所以Kotlin也是一种面向对象的语言,如果你熟悉Java,你应该很快可以上手,这篇文章假设你已经熟悉Java语言了。
1. 类与构造函数
Kotlin中的类与接口和Java中的有些区别。
Kotlin中接口可以包含属性申明。
Kotlin的类申明,默认是final和public的。
Kotlin的嵌套类并不是默认在内部的,他们不包含外部类的隐私引用。
Kotlin的构造函数,分为主构造函数和次构造函数。
Kotlin中可以使用data关键字来申明一个数据类。
Kotlin中可以使用object关键字来表示单例对象、伴生对象等。
Kotlin的类由下面几部分组成:
构造函数和初始化块。
属性
函数
嵌套类和内部类
对象申明
1.1 类的声明
使用class关键字声明,这个跟Java是一样的,如果你申明的类不包含任何东西的话,可以自己class后面直接写上类名。
class Person
1.2 构造函数
在Kotlin中可以有一个主构造函数,一个或者多个次构造函数。
主构造函数
主构造函数直接跟在类名后面,如下:
open class Person constructor(var name: String, var age: Int) : Any() {
...
}
主构造函数中申明的属性可以是可变的(var)也可以是不变的(val)。如果主构造函数没有任何注解或者可见性修饰符,可以省略constructor关键字,而且Koltin中的类默认就是继承Any的,也可以省略。所以可以简化成如下:
open class Person(var name: String, var age: Int) {
...
}
如果这个类是有注解或者可见性修饰符,那么constructor关键字不可少,如下:
class Student @MyAutoware public constructor(name: String, age: Int) : Person(name, age) {
...
}
主构造函数不能包括任何代码。初始化代码可以放到以init关键字作为前缀的初始化块中:
class Student @MyAutoware public constructor(name: String, age: Int) : Person(name, age) {
init {
println("Student(name = $name, age = $age) created")
}
}
主构造函数的参数可以在初始化块中使用,也可以在类体内申明的属性初始化器中使用。
次构造函数
我们也可以在类体中使用constructor申明次构造函数,次构造函数的参数不能使用val或者var申明。
annotation class MyAutoware
class Student @MyAutoware public constructor(name: String, age: Int) : Person(name, age) {
var grade: Int = 1
init {
println("Student(name = $name, age = $age) created")
}
constructor(name: String, age: Int, grade: Int) : this(name, age){
this.grade = grade
}
}
如果一个类有主构造函数,那么每个次构造函数都需要委托给主构造函数,委托到同一个类的另一个构造函数可以使用this关键字,如上面这个例子this(name, age)
如果一个非抽象类没有申明任何构造函数(包括主或者次),它会生成一个不带参数的主构造函数。构造函数的可见性是public。
私有的主构造函数
如果我们不希望这个类被实例化,我们可以申明如下:
class CantCreateMe private constructor()
cancreateme
当然我们可以通过次构造函数来创建。
class CantCreateMe private constructor(){
var name: String = ""
constructor(name: String) : this() {
this.name = name
}
}
1.3 属性
class Point{
var x:Int = 0
var y:Int = 0
}
fun main(args: Array) {
val p = Point()
p.x = 8
p.y = 10
println("Point(x = ${p.x}, y = ${p.y})")
}
可以看出Kotlin中的类的字段自动带有getter和setter方法,比Java会简洁很多。
1.3 方法(函数)
class Point{
var x:Int = 0
var y:Int = 0
operator fun plus(p: Point) {
x += p.x
y += p.y
}
}
fun main(args: Array) {
val p = Point()
p.x = 8
p.y = 10
val p1 = Point()
p1.x = 2
p1.y = 3
val p2 = p + p1
println("Point(x = ${p.x}, y = ${p.y})")
}
2. 抽象类
下面就是一个抽象类,类需要用abstract修饰,其中也有抽象方法,跟Java有区别的是Kotlin的抽象类可以包含抽象属性。
abstract class Person(var name: String, var age: Int){
abstract var addr: String
abstract val weight: Float
abstract fun doEat()
abstract fun doWalk()
fun doSwim() {
println("I am Swimming ... ")
}
open fun doSleep() {
println("I am Sleeping ... ")
}
}
2.1 抽象函数(方法)
在上面这个抽象类中,有doEat和doWalk抽象函数,同时还有具体的实现函数doSwim,在Kotlin中如果类和方法没有修饰符的化