原创

Kotlin的类和对象

Kotlin支持面向对象编程,Kotlin提供了定义类、属性、方法等最基本的功能。

类是面向对象的重要内容,可以把类当成一种自定义类型,可以使用类来定义变量。这种类型的变量统称为引用变量

一、定义类

Kotlin定义类的简单语法如下:

[修饰符]  class  类名  [constructor  主构造器] {
    零个到多个次构造器定义
    零个到多个属性
    零个到多个方法
}
  • 修饰符可以是public|internal|private|final|open|abstract,或者完全省略修饰符。
  • Kotlin的类名必须是由一个或多个有意义的单词连缀而成的,每个单词首字母大写,其他字母全部小写,单词之间不要任何分隔符。

Kotlin的类定义由类名类头用花括号包围的类体构成。

  • 属性用于定义该类的对象所包含的状态数据;
  • 方法则用于定义该类的对象的行为特征或者功能实现;
  • 构造器用于构造该类的对象,Kotlin通过调用构造返回该类的对象。

构造器是一个类创建对象的根本途径,如果一个类没有构造器,这个类通常无法创建对象。

一个Kotlin类可以有0~1个主构造器和0~N个次构造器。

  • 主构造器是类头的一部分,它跟在类名(和泛型声明)后;主构造器就是在类头使用constructor关键字定义一个无执行体的构造器。
class User constructor(firstName: String) {
    
}

如果主构造器没有任何注解或修饰符,则可以省略constructor关键字。

class User(firstName: String) {
    
}

Kotlin还提供了一个功能:如果没有为非抽象类定义任何构造器,系统会自动提供一个无参数的主构造器,该构造器默认用public修饰。

定义属性的语法格式:

[修饰符]  var|val  属性名:类型  [= 默认值 ]
        [<getter>]
        [<setter>]
  • 修饰符:修饰符可以省略,也可以是public|protected|internal|private、final|open|abstruct。
  • var|val:使用var声明读写属性,使用val声明只读属性。
  • 属性名:属性用于描述一个类的对象包含的状态数据,所以建议属性名使用英文名词。
  • 类型:类型可以是Kotlin允许的任何数据类型。如果Kotlin可以从初始值或getter方法的返回值推断出属性的类型,则可以省略属性的类型。
  • 默认值:定义属性时还可以指定一个可选的默认值。要么在此处指定初始值,要么在构造器或初始化块中指定初始值。
  • getter、setter:用于为该属性编写自定义的getter、setter方法。如果不指定,Kotlin会为读写属性提供默认的getter、setter方法;为只读属性提供默认的getter方法。

定义构造器的语法格式:

[修饰符] constructor (形参列表){
    //由零条到多条可执行语句组成的构造器执行体
}
  • 修饰符:修饰符可以省略,也可以是public、protected、internal、private其中之一。
  • 形参列表:其格式和定义方法的形参列表的格式完全相同。

构造器既不能定义返回值类型,也不能使用Unit声明构造器没有返回值。

class Person {
    //定义两个属性
    var name: String = ""
    var age: Int = 0
    //定义了一个方法
    fun say(content: String) {
        println(content)
    }
}

上面的类没有定义构造器,系统将提供一个默认的构造器,系统提供的构造器总是没有参数的。

二、对象的产生和使用

创建对象的根本途径是构造器,调用某个类的构造器即可创建这个类的对象,并且无须使用new关键字。

fun main(args: Array<String>) {
    //使用Person类定义一个Person类型的变量
    var p: Person
    //调用Person类的构造器,返回一个Person对象
    p = Person()
}

Kotlin的对象有如下作用:

  • 访问对象的属性
  • 调用对象的方法
fun main(args: Array<String>) {
    //使用Person类定义一个Person类型的变量
    var p: Person
    //调用Person类的构造器,返回一个Person对象
    p = Person()

    p.name = "HunterArley"

    p.say("大家好,很高兴认识大家!")
    println(p.name)
}

输出结果:

大家好,很高兴认识大家!
HunterArley

三、对象的this引用

Kotlin也提供了this关键字,this关键字总是指向调用该方法的对象。

个人剧this出现位置的不同,this作为对象的默认引用有两种情形:

  • 在构造器中引用该构造器正在初始化的对象;
  • 在方法中引用调用该方法的对象。

this关键字最大的作用就是让类中的一个方法访问该类的另一个方法或属性。

class Dog{
    fun jump(){
        println("这是jump方法")
    }
    
    fun run(){
        //使用this引用调用run()方法的对象
        this.jump()
        println("这是run方法")
    }
}

一个方法调用类中的其他方法、属性时无须使用this前缀,但是如果方法中有一个局部变量和属性同名,程序又需要在该方法中访问这个被隐藏的属性,则必须使用this前缀。

this引用也可用于构造器中作为默认引用。由于构造器是直接调用的,而不是使用对象来调用的,所以this在构造器中代表该构造器正在初始化的对象。

fun main(args: Array<String>) {
    println(ThisInConstructor().foo)
}

class ThisInConstructor {
    //定义一个名为foo的属性
    var foo: Int

    constructor() {
        val foo = 0
        this.foo = 6
    }
}

输出结果:

6

当this作为对象的默认引用使用时,程序可以像访问普通变量一样来访问this引用,甚至可以把this当成普通方法的返回值。

fun main(args: Array<String>) {
    val rt = ReturnThis()
    rt.grow()
        .grow()
        .grow()
    println("rt的age属性值是:${rt.age}")
}

class ReturnThis {
    var age = 0
    fun grow(): ReturnThis {
        age++
        //return this返回调用该方法的对象
        return this
    }
}

输出结果:

rt的age属性值是:3

使用this作为方法的返回值可以让代码更加简洁,但是可能造成实际意义的模糊。

学海无涯苦作舟

我的微信公众号.jpg

基本语法
  • 作者:HunterArley (联系作者)
  • 发表时间:2019-11-21 10:51
  • 版权声明:本网站部分内容转载于合作站点或其他站点,但都会注明作/译者和原出处。如有不妥之处,敬请指出。
  • 公众号转载:请在文末添加作者公众号二维码