5:kotlin 类(Classes )

kotlin支持面向对象编程,也有雷和对象的概念

要声明一个类需要使用class关键字

kotlin 复制代码
class Customer

属性(Properties)

  • 可以在类名后边添加(),在()里边声明属性
kotlin 复制代码
class Contact(val id: Int, var email: String)

声明了不可变属性id和可变属性email

  • 可以在()后边添加{},在{}中声明属性
kotlin 复制代码
class Contact(val id: Int, var email: String) {
    val category: String = ""
}

声明了不可变属性id、可变属性email和不可变属性category。category设默认值""
建议声明不可变属性,除非在创建对象后需要修改它
()内的一般称为头文件
在()内声明属性时可以不使用val和var,但是类实例化后该属性不可见。见实例化

实例化(Create instance)

可以使用构造函数创建一个实例

默认情况下kotlin会使用头文件中定义的参数创建一个构造函数

kotlin 复制代码
fun main(){
    val contact1 = Contact(1, "123@mail.com",  0)
    val contact2 = Contact(2, order =  1)
    
    println(contact1.email)  // 123@mail.com
    println(contact1.id) // 1
    println(contact1.category) // 122
//    println(contact.order)  // Unresolved reference: orde

    println(contact2.email)  // abc@mail.com
    println(contact2.id) // 2
    println(contact2.category) // 122
}

访问属性(Access properties)

实例化中contact1.email等方式就属于访问属性

模板字符串可以拼接实例的属性,注意使用${}
println("邮箱是${contact2.email}") //邮箱是abc@mail.com

成员方法(Member functions)

成员函数要定义在类中,调用方法和访问属性类似

kotlin 复制代码
class Contact(val id: Int, var email: String = "abc@mail.com", order: Int) {
    val category: String = "122"
    fun printEmail() {
        println("邮箱是${email}")
    }
}

fun main() {
    val contact = Contact(1, "123@mail.com", 0)
    contact.printEmail()    // 邮箱是123@mail.com
}

数据类(Data classes)

数据类和普通类相似,但是会额外生成一些成员函数,这些成员函数格式化输出格式,对比实例,复制实例等。

使用`data class``声明一个数据类

kotlin 复制代码
data class User(val name: String, val id: Int) 
方法 说明
.toString() 格式化输出实例的属性
.equals() or == 对实例作比较
.copy() 通过一个实例创建里一个实例

toString

kotlin 复制代码
data class User(val name: String, val id: Int)

fun main(){
    val user = User("王老吉",1)

    println(user.toString())    // User(name=王老吉, id=1)
}

equals / ==

kotlin 复制代码
data class User(val name: String, val id: Int)

fun main(){
    val user1 = User("王老吉",1)
    val user2 = User("王老吉",1)
    val user3 = User("王老吉",2)

    println(user1.equals(user2))    // true
    println(user1 == user2)    // true
    println(user1.equals(user3))    // false
    println(user1.equals("王老吉"))   // false
}

copy

kotlin 复制代码
data class User(val name: String, val id: Int)

fun main(){
    val user = User("王老吉",1)

    println(user.copy())    // User(name=王老吉, id=1)
    println(user.copy("加多宝"))    // User(name=加多宝, id=1)
    println(user.copy(id=2))    // User(name=王老吉, id=2)
}

创建一个新的实例比修改原始实例更安全,因为原始实例的属性不会改变

相关推荐
SomeOtherTime39 分钟前
Rust生命周期介绍(AI回答)
开发语言·后端·rust
程序猿打工仔1 小时前
计算机基础(C语言)考编、专技岗
c语言·开发语言·算法
喵本喵叁肆1 小时前
Rényi 差分隐私:把隐私损失看成一族矩(英文原题:Rényi Differential Privacy (CSF 2017))
开发语言·r语言
普通人62 小时前
MySQL_FIND_IN_SET函数详解
android·数据库·mysql
Hvitur2 小时前
Java - Lambda
java·开发语言·python
xiaoye-duck2 小时前
《C++ 项目:手写大模型接入 SDK》DataManager数据管理模块:SQLite持久化存储
开发语言·数据库·c++·sqlite
Evand J2 小时前
【MATLAB例程,PMSM19】永磁同步电机(PMSM)基于多速率无迹卡尔曼滤波(UKF)的转速与转子位置估计。测量缺失、状态预测与恢复性能分析
开发语言·matlab·电机·ekf·卡尔曼·电机滤波
喵了几个咪3 小时前
GoWind Flow 拆解:一个 Go 工作流引擎与它的双模式设计器
开发语言·人工智能·后端·golang
꧁细听勿语情꧂3 小时前
二叉树余题,排序、直接插入排序、希尔排序
c语言·开发语言·数据结构·算法
是main不是漫3 小时前
【C++——类和对象(上)】筑基篇:以封装奠定面向对象之基
c语言·开发语言·c++