快速入门Kotlin③类与对象

构造函数

主构造函数:主构造函数是类头的一部分,它跟在类名后面。主构造函数没有函数体,它可以包含初始化代码和属性声明。初始化块:init关键字修饰,它直接写在类体中。它的执行顺序与它们在类体中的出现顺序一致。

次构造函数:次要构造函数是可选的,用于提供额外的构造方式。次要构造函数必须直接或间接地调用主构造函数。

fun main() {
   val person = Person("Kevin", 21) //输出:Person object created
   val person2 = Person2("Kevin") //输出:Person2 object created Person2 is: Kevin
}

//主构造函数:主构造函数在类头中声明,它跟在类名与可选的类型参数后。
class Person(val name: String, var age: Int) {
    //初始化块中的代码实际上会成为主构造函数的一部分
    init {
        println("Person object created")
    }
}

//次要构造函数:类也可以声明前缀有 constructor的次构造函数
class Person2 {
    private var name: String = ""
    private var age: Int = 0

    init {
        println("Person2 object created")
    }

    // 次构造函数
    constructor(name: String) {
        this.name = name
        println("Person2 is: $name")
    }

     // 主构造函数
    constructor(name: String, age: Int) {
        this.name = name
        this.age = age
    }
}

创建类的实例

创建一个类的实例,只需像普通函数一样调用构造函数。

fun main() {
    val person = Person("Kevin", 21) //输出:Person object created
    val person2 = Person2("Kevin") //输出:Person2 object created Person2 is: Kevin
}
 //....

类成员

主要包括:构造函数与初始化块(本文第一小节)、函数、属性、嵌套类/内部类、对象声明部分。

属性

  • 属性可以用关键字 var 声明为可变的, 也可以用关键字 val 声明为只读的;

  • Getter 与 Setter:1.可变属性默认提供Getter 与 Setter。只读属性不允许 setter;2.可以自定义访问器。

  • 编译期常量:使用 const 修饰符将其标记为编译期常量。必须位于顶层或者是 object 声明伴生对象的一个成员;必须以 String 或原生类型值初始化;不能有自定义 getter。

  • 延迟初始化属性和变量:lateinit修饰符可以用于延迟初始化属性。允许你将其初始化推迟到第一次使用时。比如:属性的值无法在构造函数中立即确定的情况下。它只适用对象的创建或计算,而不适用于基本数据类型(如Int、Boolean等)。基本数据类型的值可以在声明时直接进行初始化。延迟初始化也可以使用by lazy修饰。

//编译期常量:必须位于顶层或者是 object 声明 或伴生对象的一个成员;必须以 String 或原生类型值初始化;不能有自定义 getter
const val HELLO_KOTLIN = "Hello, Kotlin"
fun main() {
    val rectangle = Rectangle(3, 4)
    println(rectangle.area) //输出:12

    rectangle.printName() //输出:not init

    // 使用 `lateinit` 修饰符时,需要确保在首次使用之前对属性进行初始化;
    // 否则会抛出 `UninitializedPropertyAccessException` 异常。
    rectangle.initializeName()
    rectangle.printName() //输出:init, name is John
    rectangle.printName2() //输出:John
}

class Rectangle(private val width: Int, private val height: Int) {
    //延迟初始化1:lateinit var,lateinit修饰符可以用于延迟初始化属性
    lateinit var name: String

    //延迟初始化2:by lazy
    // lazy 是 Kotlin 标准库提供的一个函数,可以用于延迟初始化属性。它接收一个 lambda 表达式作为参数,在第一次访问属性时执行 lambda 表达式,并将结果作为属性的值返回。
    private val name2: String by lazy {
        "John"
    }

    //自定义getter:如果定义了一个自定义的 getter,那么每次访问该属性时都会调用它。
    val area: Int get() = this.width * this.height
    init {
        println(HELLO_KOTLIN)
    }

    fun initializeName() {
        name = "Rectangle"
    }

    fun printName() {
        //检测一个 lateinit var 是否已经初始化过,请在该属性的引用上使用 .isInitialized
        if (::name.isInitialized) {
            println("init, name is $name")
        } else {
            println("not init")
        }
    }

    fun printName2() {
        println(name2)
    }
}
latei

相关推荐

  1. 快速入门Kotlin对象

    2024-03-25 08:26:03       20 阅读
  2. kotlin语法快速入门-接口接口实现(8)

    2024-03-25 08:26:03       12 阅读
  3. 11:kotlin 对象 -- 普通

    2024-03-25 08:26:03       43 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-25 08:26:03       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-25 08:26:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-25 08:26:03       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-25 08:26:03       20 阅读

热门阅读

  1. 如何理解React

    2024-03-25 08:26:03       21 阅读
  2. Linux命令-dig命令(域名查询工具)

    2024-03-25 08:26:03       18 阅读
  3. 利用K8S Statefulset搭建Etcd集群 - 本地存储

    2024-03-25 08:26:03       22 阅读
  4. 数据分析-概率分布

    2024-03-25 08:26:03       33 阅读
  5. 蔚来-安全开发一面/二面

    2024-03-25 08:26:03       15 阅读
  6. 亚马逊认证考试系列 - 知识点 - 安全组简介

    2024-03-25 08:26:03       19 阅读
  7. Rust教程:How to Rust-基本类型

    2024-03-25 08:26:03       19 阅读
  8. 每天学习一个Linux命令之apt

    2024-03-25 08:26:03       19 阅读
  9. RabbitMQ的事务机制

    2024-03-25 08:26:03       16 阅读
  10. RabbitMQ如何保证消息不丢?

    2024-03-25 08:26:03       18 阅读
  11. 14个Python自动化实战脚本

    2024-03-25 08:26:03       16 阅读
  12. [AIGC] 使用Spring Boot进行单元测试:一份指南

    2024-03-25 08:26:03       21 阅读