【Java高级】深入浅出谈Object类
作者:互联网
作者:Beyong
出处:https://blog.csdn.net/weixin_45965358/article/details/116533572?spm=1001.2014.3001.5502
本博客中未标明转载的文章归作者Beyong有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
文章目录
一.什么是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,String,s3,Object,equals,s5,println 来源: https://blog.csdn.net/weixin_45965358/article/details/116533572