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)
三,测试效果:

浙公网安备 33010602011771号