Object的用法

本文深入探讨了Java中equals方法的四大特性,包括自反性、对称性、传递性和持久性,以及equals与hashcode之间的关系。强调了在HashMap内部类Node中覆写equals和hashcode的重要性,避免使用Object默认实现。同时,文章还提到了finalize函数的作用,作为垃圾回收前的最后确认。

3点,

首先equals的四大特性, 自反性,就是自己一定要等于自己;对称性,x=y,那么y=x一定可以;传递性,x=y,y=z, 那么x=z; 持久性:x=y,那么一段时间内一直等于y.

 

第二,表明这个equals的意义,就是refer to the same object

第三,如果重新hashcode,要保证the equal objects mast have equal hashcode

但是hashcode相等不一定相等。

 

上面是HashMap里面的一个内部类,Node,覆写了equals,于是也覆写了hashcode,因为如果不覆写,那么就是使用object自带的哪个,那个是native方法,是根据一定算法生成,符合Object类的equals函数,也就是两个对象一样。其实覆写hashcode最重要的是确保equals返回true的时候,hashcode一样;还有就是不能重复率太高,不然放入hashmap里面冲突的概率会非常高。

 

这样一来,最简单的就是上面那样,调用值的hashcode方法并运算一下,不一定交,并,或也可以。

^表示异或。

 

Object里面还有关于锁的wait和notify。详情请看之前的博客。

 

Object里面另一个重要的函数,就是finalize函数。其实finalize函数可以理解为垃圾回收前的最后确认函数。如果在finalize函数里面再次给要回收的对象加上引用,那么就不会被回收。

只会在确认这个函数没有引用的时候调用。

 

Object位于java.lang包里面。还有一个Objects位于java.util,是Object的一个工具类。主要是比较和判空,都是static方法

 

 

 

 

 

 

<think>好的,用户想了解Android Studio中Object关键字的用法,特别是使用方法及示例。首先,我需要回忆一下Kotlin中object的几种常见应用场景,因为Android开发现在主要用Kotlin。根据之前的引用内容,用户提供的引用[1]提到Kotlin使用object定义单例对象,引用[2]则讲到了匿名对象的使用。这两个方面应该是重点。 首先,单例模式。在Kotlin中,使用object可以轻松创建单例,无需像Java那样手动实现双重检查锁定等。需要给出一个例子,比如管理应用设置的单例,里面包含属性和方法,这样用户能直观看到怎么用。同时要说明object声明的类在首次访问时初始化,且线程安全。 然后,匿名对象。用户在Java中常用匿名内部类,比如设置点击事件。Kotlin里用object代替new,需要对比Java和Kotlin的写法差异。例子中的OnClickListener就是一个好例子,展示如何用object创建匿名对象,并可能提到如果接口是函数式接口,可以用lambda简化,但这里还是以object为主。 另外,可能还有伴生对象(Companion Object),用于类中的静态成员。虽然用户的问题可能没直接提到,但这也是object的一个重要用途,应该包含进来。比如工厂方法或者常量定义,可以放在伴生对象里,这样不需要实例化类就能访问。 需要注意用户提供的引用中有提到MainActivity的代码,里面可能涉及对象的使用,但例子中没有明显使用object关键字,所以可能不需要直接引用。但需要确保示例代码符合Android Studio的环境,比如在Activity中使用单例或匿名对象。 还要考虑用户可能的疑问,比如单例的线程安全性、对象初始化的时机,以及和Java静态方法的区别。不过用户主要问的是用法和示例,所以先集中在基本应用上,如果有相关问题可以在最后提出。 最后,生成的相关问题需要围绕object的其他用法、单例与伴生对象的区别、性能考虑等,帮助用户进一步探索。检查是否有遗漏,比如对象表达式或密封类中的使用,但可能超出当前范围,保持回答简洁。</think>### Android Studio中Object关键字的用法详解 在Android开发(Kotlin语言)中,`object`关键字有三种核心应用场景,以下是具体用法及示例: --- #### 一、单例对象声明 通过`object`直接声明线程安全的单例对象,无需手动实现双重检查锁定模式[^1]: ```kotlin object NetworkManager { private const val BASE_URL = "https://api.example.com" fun fetchData(endpoint: String) { // 网络请求实现 } } ``` ▷ 调用方式:`NetworkManager.fetchData("/users")` ▷ 首次访问时自动初始化,全局唯一实例 --- #### 二、匿名对象创建 替代Java的匿名内部类写法,用于事件监听等场景[^2]: ```kotlin button.setOnClickListener(object : View.OnClickListener { override fun onClick(v: View?) { Toast.makeText(context, "点击事件", Toast.LENGTH_SHORT).show() } }) ``` ▷ 适用于实现接口/抽象类的临时对象 ▷ 注意:每次调用都会创建新对象 --- #### 三、伴生对象(Companion Object) 在类内部声明共享成员,替代Java的`static`关键字: ```kotlin class User(val id: Int) { companion object { private var nextId = 0 fun create(): User { return User(nextId++) } } } ``` ▷ 调用方式:`User.create()` ▷ 支持实现接口、扩展函数等高级特性 --- ### 综合应用示例 ```kotlin // 单例配置管理器 object AppConfig { var themeMode = "light" fun toggleTheme() { themeMode = if (themeMode == "light") "dark" else "light" } } // Activity中使用 class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // 匿名对象作为回调 findViewById<Button>(R.id.btn_theme).setOnClickListener( object : View.OnClickListener { override fun onClick(v: View?) { AppConfig.toggleTheme() applyTheme() } } ) } companion object { const val TAG = "MainActivity" } } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值