kotlin: data类和普通类的区别

一,data类和普通类的区别

1, 主构造函数必须至少有一个参数,且参数标记为 val 或 var

数据类的主构造函数必须至少有一个参数,并且这些参数必须使用 val 或 var 声明。
普通类则没有这样的要求。

2,数据类自动生成了以下方法:

toString():生成格式化的字符串表示,如:User(name=John, age=30);
componentN() 函数:支持解构声明访问属性;
equals() 和 hashCode() :比较两个对象的内容是否相等(而非引用相等),仅基于主构造函数中声明的属性;
copy() 方法:快速创建对象的副本,并可选择性修改部分属性(适用于不可变对象);

二,代码

package com.example.okdemo1.activity

import android.os.Bundle
import android.util.Log
import android.view.MenuItem
import android.widget.Button
import android.widget.Toast
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.Fragment
import androidx.viewpager2.widget.ViewPager2
import androidx.viewpager2.widget.ViewPager2.OnPageChangeCallback
import com.example.okdemo1.R
import com.example.okdemo1.adapter.FragAdapter
import com.example.okdemo1.fragment.Cate1Fragment
import com.example.okdemo1.fragment.Cate2Fragment
import com.example.okdemo1.fragment.Cate3Fragment
import com.example.okdemo1.model.Goods1
import com.google.android.material.bottomnavigation.BottomNavigationView
import com.google.android.material.navigation.NavigationBarView

class Bottom2Activity : AppCompatActivity() {

    /*
    private val fragmentList: MutableList<Fragment?> = ArrayList<Fragment?>() //fragment的列表
    private var vp_content: ViewPager2? = null //viewpager2

    private var bottomNavigationView: BottomNavigationView? = null //底部导航栏
    */

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        this.enableEdgeToEdge()
        setContentView(R.layout.activity_bottom2)

        val button1: Button = findViewById(R.id.button1)
        button1.setOnClickListener {
            // 在这里处理点击事件
            // data类和普通类的区别
            val user = User("John", 30)
            // toString 格式化输出
            println(user.toString()) // User(name=John, age=30)

            val person = Person("Danny", 31)
            println(person.toString())   //com.example.okdemo1.activity.Person@b353bcc

            // 解构声明,解构为 name 和 age
            val (name, age) = user
            println("name = $name, age = $age") // name = John, age = 30

            //person对象不支持解构的写法

            // equals() 比较内容
            val user1 = User("Danny", 31)
            val user2 = User("Danny", 31)
            // 数据类自动重写了 equals() 方法,比较内容
            println("user1 == user2 ? ${user1 == user2}") // user1 == user2 ? true,

            val person1 = Person("Danny", 31)
            val person2 = Person("Danny", 31)
            // 普通类默认比较引用
            println("person1 == person2 ? ${person1 == person2}") // person1 == person2 ? false

            // copy() 创建副本
            val newUser = user.copy(age = 32)
            println("newUser.age = ${newUser.age}") // newUser.age = 32

            // person对象不能执行copy方法
        }
    }
}

data class User(val name: String, val age: Int)

class Person(val name: String, val age: Int)

三,测试效果:

posted @ 2025-06-22 12:50  刘宏缔的架构森林  阅读(49)  评论(0)    收藏  举报