【2025最新版Kotlin教程】Kotlin第一行代码系列第四课-普通类的详解
经过前面属性和函数的学习,属性和函数一起描绘一个抽象的模型,就是类了
一、类的定义:
fun main() {
// 用class关键字定义 ,
// 方式1: 下面SimpleClassTest就是个类了,默认构造函数是SimpleClassTest()
class SimpleClassTest {
}
// 调用构造函数就可以生成对象
/**
* 注意:为什么要生成对象,因为类只是个模型,就好像个汽车模型,它有颜色属性,会跑的函数。
* 但是你造成汽车来,它才有实体意思
*/
val simpleClassTest = SimpleClassTest()
// 方式2:如果我想生成对象时传些参数来区别不同的对象或者其他逻辑处理呢
/**
* 注意:仔细看构造函数中name和sex的区别,sex前有var,name没有
* 有var或者val声明的,就是类的变量并且赋值了,没有的只是传值到构造函数的,其他函数当然没法调用
* 一般都会加var或者val
*/
class SimpleClassTest2(name:String,var sex:Int){
fun song(){
// 放开下面的注释你就懂了
//println("我是${name},性别是${sex},我不会唱歌")
}
}
// 方式3:如果我想有多个构造函数怎么办
// 用默认赋值参数方式来顶多个构造函数
// age是默认参数,可传可不传,这样它有就两个构造函数了
class SimpleClassTest3(var name:String,var sex:Int,val age:Int = 100){
fun song(){
println("我是${name},性别是${sex},我不会唱歌")
}
}
val simpleClassTest3 = SimpleClassTest3("小红",1)
val simpleClassTest4 = SimpleClassTest3("小红",1,18)
//=============================================== 类额外知识 =========================================================
// init的用法,它挺好用的
// 具体看ClassInitTest文件
/**
* 看下类的变量的getter和setter方法
* 一时间你可能找不到它使用的场景,可以脑海有这样的写法
*/
// getter
class Person(val name: String, var age: Int) {
val isAdult: Boolean
get() {
// 这里是方法,你可以加你想加的逻辑
return age >= 18
}
}
// setter
class Person1(val name: String) {
var age: Int = 0
set(value: Int) {
//加些逻辑比如 +1
val value2 = value+1
// field就是最后给age的值
field = value2
}
}
/**
* 选学:次构造函数,知道就好
* constructor 很少用到,且定义复杂
*/
class SimpleClassTest4(var name:String,var sex:Int,val age:Int = 100){
constructor(name1:String, sex1:Int, age1:Int,weight:Int):this(name1, sex1)
fun song(){
println("我是${name},性别是${sex},我不会唱歌")
}
}
// 用构造函数生成的对象
val simpleClassTest5 = SimpleClassTest4("小红",1,18,120)
}
二、 初始化块(init)例子:
/**
*
* 初始化块(init)例子
* 初始化块代码是在构造类的实例时执行
*
* 初始化顺序:
* 主构造函数里声明的属性 --> 类级别的属性赋值 --> init初始化块 --> 次构造函数里的属性
*/
private class ClassInitTest(var name: String) {
constructor():this(name="Zhang"){
println("次构造函数---------->>>")
}
/**
* 构造类的实例时执行,构造函数中执行
*/
init {
println("构造类的实例时执行------> init")
}
}
fun main() {
val initTest = ClassInitTest("Zhang3")
}
三、数据类 data class
/**
* 数据类 data class
* 即一个类只有变量赋值,没有方法,就可以定义为数据类
* 在Android开发中,它常用于接收接口返回的数据
*/
data class UserBean(
var name:String?, //如果接口返回可能为null,就要定义为可为null,否则程序就会崩溃
var age:Int = 18,
val sex:Int = 1,
val giftBean: GiftBean
)
data class GiftBean(
val gold: Int,
val id: Int,
val img: String,
val isDefault: Int,
val name: String,
val giftBean2: GiftBean2
){
data class GiftBean2(
val gold2: Int
)
}
data class Person(
val name:String,
val age:Int
)
fun main() {
// 高级用法,解构语法
val person = Person("小红",25)
// 这里x就是name了,可能你很少用,但看见时就不要懵逼了
val (x,y) = person
println(x)
}
四、解构类:
/**
*
* 数据类示例
*
* 采用<code>data</code>关键字修饰
* 1.用data修饰的类默认实现了父类Any类的toString、equals、hashCode函数
*
* 2.另外提供了copy函数,类似Java的clone,拷贝的时候执行的是主构造函数,若其中一个变量是在次构造函数中赋值的,则无法copy过来,需要手动设置值。
*
* 3.支持结构语法,定义方式
* operator fun component1() = x
* operator fun component2() = x
* ...
* operator componentN() = x
* 主构造函数有几个参数就会生产对应几个component
*/
data class DataClassTest(var x: Int, var y: Int) {
val isInvalidate = x > 0 && y > 0
}
/**
* 普通类支持解构定义
*/
class Coor(var x: Int, var y: Int) {
operator fun component1() = x
operator fun component2() = y
}
fun main() {
println(DataClassTest(10, 5))
println(DataClassTest(10, 5).isInvalidate)
//支持解构操作
val (x, y) = DataClassTest(10, 20)
//普通类支持解构语法
val (p,q) = Coor(10,20)
}
整个kotlin教程的项目源码结构图:
有Android开发或者鸿蒙开发需求问题或者完整源码的可以看简介联系我,也可以私信我,我每天都看私信的