Kotlin学习之类

本文介绍了Kotlin中类的定义方法及构造函数的使用,包括主构造函数和次构造函数的特点与应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Kotlin学习之类

@(Kotlin学习)

Kotlin在面向对象上具有和Java相似的特征,但是针对不同的情况进行了不同的优化。

一、定义类

Kotlin中使用关键字class声明类:

class  类名 [主构造函数]{
    //类成员
}

类声明由类名、类头(指定其类型参数、主构造函数等)和由大括号包围的类体构成。

如果一个类没有类体,也可以省略花括号:

class  类名

二、构造函数

在Kotlin中的一个类可以有一个主构造函数和一个或多个次构造函数。

2.1主构造函数

主构造函数的类头的一部分:跟在类名(和可选的类型参数)后。

如下是一个Java类:

public class Person {
    String name;
    public Person(String name) {
        this.name = name;
    }
}

用Kotlin可以这样写:

class Person constructor(name: String) {
    val name: String
    init {
        this.name = name
    }
}

使用class定义了一个类Person,然后在类头用constructor关键字定义带有一个String类型参数的主构造函数。在类体里定义了一个不可变的String类型成员变量name,然后使用init关键字定义主构造函数的行为,把主构造函数的name参数赋给成员变量name。

  • 如果主构造函数没有任何注解或者可见性修饰符,可以省略constructor关键字。如下:
class Person(name: String) {
    val name: String
    init {
        this.name = name
    }
}
  • 如果在主构造函数前使用修饰符或注解,就不可以省略constructor:
class Person private constructor(name: String) {
    val name: String
    init {
        this.name = name
    }
}
  • 如果主构造函数中定义的参数使用val或var修饰,则会创建与这个参数同名的成员变量,并使用传入的参数值初始化这个成员变量。
  • 主构造函数中不能包含任何的代码;初始化的代码可以放在以init关键字作为前缀的初始化块(initializer blocks)
2.2次构造函数

在Java中,一个类往往会有多个不同的构造函数,他们一般有如下关系:
- 参数列表由少到多,参数列表少的构造函数使用默认值调用参数列表多的构造函数。对于常见的类型,Kotlin中使用函数默认参数的方法简化代码。
- 不同的构造方法使用不同的参数列表,相互之间存在调用的关系。Kotlin使用次构造函数委托的解决方法。

Java的Person类如下所示:

public class Person {
  long id;
  String name = "";
  int age = 0;

  public Person(long id, String name, int age) {
    this.id = id;
    this.name = name;
    this.age = age;
  }
  public Person(long id, String name) {
    this.id = id;
    this.name = name;
  }
  public Person(long id, int age) {
    this.id = id;
    this.age = age;
  }
  public Person(long id) {
    this.id = id;
  }
}

使用Kotlin可以简化上述代码:

class Person(val id: Long, val name: String = "", val age: Int = 0)
  • 参数列表中定义了三个参数,都使用val关键字修饰,说明要使用它们创建成员变量并初始化;
  • name和age参数后面都使用= 默认值的方式声明了默认值,在调用主构造函数的时候,如果不传入参数,就会使用指定的默认值。

类也可以声明前缀有constructor的次构造函数:

class Person {
    constructor(parent: Person) {
        parent.children.add(this)
    }
}

如果有一个主构造函数,每个次构造函数需要委托给主构造函数,可以直接委托或者通过别的次构造函数间接委托。

委托到同一个类的另一个构造函数用this关键字即可:

class Person(val name: String) {
    constructor(name: String, parent: Person) : this(name) {
        parent.children.add(this)
    }
}

如果一个非抽象类没有声明任何构造函数,它会有一个生成的不带参数的主构造函数。

如果不希望类中有一个共有构造函数,需要声明一个带有非默认可见性的空的主构造函数:

class DontCreateMe private constructor () {
}

注意:
- 如果类已经有了一个主构造函数,那么所有的次构造函数都要直接或间接地委托给主构造函数。所有的次构造函数都会先调用主构造函数,再执行自己的代码。constructor([参数列表]): this([参数列表]) {/*……*/}
- 次构造函数不能再参数列表中声明并初始化成员变量。

三、创建类的实例

Kotlin中没有new关键字,要创建一个类的实例,就像普通函数一样调用构造函数:

val invoice = Invoice()

val customer = Customer("Joe Smith")

学海无涯苦作舟

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员丶星霖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值