【Java高级】深入浅出谈Object类
2021/5/9 1:25:12
本文主要是介绍【Java高级】深入浅出谈Object类,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
作者:Beyong
出处:https://blog.csdn.net/weixin_45965358/article/details/116533572?spm=1001.2014.3001.5502
本博客中未标明转载的文章归作者Beyong有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
文章目录
- 一.什么是Object类
- 二.Object的特点
- 三.Object类的方法
- 1.equals
- 2.hashCode
- 3.toString
- 4.一些线程操作
- 四.API
一.什么是Object类
Object是java中每一个类的“始祖”,每一个类都是由它扩展而来的。就像我们常说我们人类的祖先是亚当,夏娃,那就是我们都是由亚当夏娃衍生而来的。
在Java中,只有基本数据类型不是对象,其他类型都是对象,都扩展了Object类。
二.Object的特点
Object类位于java.lang包中,因为java.lang包在编译时自动导入,所以我们的Object类也会自动导入。
Object有两种继承的方式:
显示继承:
隐式继承:
当我们没有显示继承任何类时,都默认继承了Object。
三.Object类的方法
1.equals
Object.equals方法是比较两个对象是否相等,也就是比较两个对象引用指向的是不是同一个对象,当然也就是比较两个对象的内存地址是否相等。
package com.sdnu.test3; /** * @ version: 1.8 * @ author: Beyong * @ date: 2021/5/8 17:02 * @ Description: TODO */ public class ExtendsTest { public static void main(String[] args){ Object s1 = new Object(); Object s2 = new Object(); Object s3 = s1; System.out.println("s1 equals s2 is : " + s1.equals(s2)); System.out.println("s1 equals s3 is : " + s1.equals(s3)); } }
然而,在实际的开发过程中,判断两个对象的引用是否相等并没有什么实际的意义。所以我们的许多方法都重写了equals方法,但要注意如果子类重写了 equals() 方法,就需要重写 hashCode() 方法,比如String类就重写了equals(),用来判断两个字符串是否相等。
package com.sdnu.test3; /** * @ version: 1.8 * @ author: Beyong * @ date: 2021/5/8 17:43 * @ Description: TODO */ public class ExtendsTest2 { public static void main(String[] args){ String s3 = new String("java"); String s4 = new String("python"); String s5 = new String("java"); String s6 = s5; System.out.println("s3 equals s4 is : " + s3.equals(s4)); System.out.println("s3 equals s5 is : " + s3.equals(s5)); System.out.println("s5 equals s6 is : " + s5.equals(s6)); } }
补充:我们重写equals要符合一定的规范:
- 自反性:对于任何非空引用 x, x.equals(x) 应该返回 true
- 对称性: 对于任何引用 x 和 y, 当且仅当 y.equals(x) 返回 true , x.equals(y) 也应该返回 true。
- 传递性: 对于任何引用 x、 y 和 z, 如果 x.equals(y) 返 N true, y.equals(z) 返回 true,x.equals(z) 也应该返回 true。
- 一致性: 如果 x 和 y 引用的对象没有发生变化,反复调用 x.eqimIS(y) 应该返回同样的结果
- 对于任意非空引用 x, x.equals(null) 应该返回 false,
2.hashCode
Object hashCode() 方法用于获取对象的 hash 值。
(简单说一下hash值,Java中的hashCode方法就是根据一定的规则将与对象相关的信息(比如对象的存储地址,对象的字段等)映射成一个数值,这个数值称作为散列值。hash值保证逻辑上的唯一性,比如字符串相同,则hash值相同,而地址值保证地址的唯一性,地址值是由系统分配的,不可能相同)
hashCode与equal的关系:
如果 x.equals(y) 返回 true, 那么 x.hashCode( ) 就必须与 y.hashCode( ) 具有相同的值
package com.sdnu.test3; /** * @ version: 1.8 * @ author: Beyong * @ date: 2021/5/8 17:43 * @ Description: TODO */ public class ExtendsTest2 { public static void main(String[] args){ String s3 = new String("java"); String s4 = new String("python"); String s5 = new String("java"); String s6 = s5; System.out.println("s3:" + s3.hashCode()); System.out.println("s4:" + s4.hashCode()); System.out.println("s5:" + s5.hashCode()); System.out.println("s6:" + s6.hashCode()); System.out.println("s3 equals s4 is : " + s3.equals(s4)); System.out.println("s3 equals s5 is : " + s3.equals(s5)); System.out.println("s5 equals s6 is : " + s5.equals(s6)); } }
3.toString
Object.toString() 方法用于返回对象的字符串表示形式。
package com.sdnu.test3; /** * @ version: 1.8 * @ author: Beyong * @ date: 2021/5/8 21:24 * @ Description: TODO */ public class ExtendsTest3 { public static void main(String[] args){ MyTest s4 = new MyTest(); System.out.println(s4.toString()); } } class MyTest{ }
返回类型为:对象的 class 名称 + @ + hashCode 的十六进制字符串
4.一些线程操作
void notify()
唤醒在该对象上等待的某个线程
void notifyAll()
唤醒在该对象上等待的所有线程
void wait()
让当前线程进入等待状态。直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法。
void wait(long timeout)
让当前线程处于等待(阻塞)状态,直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者超过参数设置的timeout超时时间。
void wait(long timeout, int nanos)
与 wait(long timeout) 方法类似,多了一个 nanos 参数,这个参数表示额外时间(以纳秒为单位,范围是 0-999999)。 所以超时的时间还需要加上 nanos 纳秒。
四.API
java.lang.Object:
Class getClass( )
返回包含对象信息的类对象。
boolean equals(Object otherObject )
比较两个对象是否相等
String toString( )
返冋描述该对象值的字符串。
java.lang.Class:
String getName( )
返回这个类的名字
Class getSuperclass( )
以 Class 对象的形式返回这个类的超类信息。
这篇关于【Java高级】深入浅出谈Object类的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-26Mybatis官方生成器资料详解与应用教程
- 2024-11-26Mybatis一级缓存资料详解与实战教程
- 2024-11-26Mybatis一级缓存资料详解:新手快速入门
- 2024-11-26SpringBoot3+JDK17搭建后端资料详尽教程
- 2024-11-26Springboot单体架构搭建资料:新手入门教程
- 2024-11-26Springboot单体架构搭建资料详解与实战教程
- 2024-11-26Springboot框架资料:新手入门教程
- 2024-11-26Springboot企业级开发资料入门教程
- 2024-11-26SpringBoot企业级开发资料详解与实战教程
- 2024-11-26Springboot微服务资料:新手入门全攻略