Object类有哪些方法
方法的结果转换成十六进制表示得来的,默认hashcode()实现是基于对象的内存地址根据哈希算法计算得出的,只不过又将结果转换为了16进制。是指,不仅要复制对象本身,还要复制对象引用类型字段指向的对象。默认实现是对象的类名和内存地址,可以在子类中重写以提供更有意义的描述。类是 Java 中所有类的根类,它定义了一些基本方法,供所有类继承和重写。类中的一个本地方法,用于 JVM 的内部初始化,不需要
Object 类是 Java 中所有类的根类,它定义了一些基本方法,供所有类继承和重写
1. 常用方法
1.1 equals(Object obj)
比较两个对象是否“相等”。默认实现是比较对象的引用地址是否相同,可以在子类中重写实现内容比较。
-
默认行为:判断引用是否相同。
-
重写场景:比较内容相等(如
String类)。
示例:
String s1 = new String("hello");
String s2 = new String("hello");
System.out.println(s1.equals(s2)); // true
1.2 hashCode()
返回对象的哈希码,用于散列存储(如 HashMap、HashSet 等)。默认实现基于对象地址,常与 equals 一起重写。
-
约定
-
如果两个对象通过
equals方法相等,它们的hashCode必须相等。 -
如果重写
equals,必须重写hashCode。
-
示例:
Object obj = new Object(); System.out.println(obj.hashCode()); // 输出哈希码
1.3 toString()
返回对象的字符串表示形式。默认实现是对象的类名和内存地址,可以在子类中重写以提供更有意义的描述。
-
默认格式:
类名@十六进制哈希值这个 "十六进制哈希值" 是通过调用
hashCode()方法的结果转换成十六进制表示得来的,默认hashcode()实现是基于对象的内存地址根据哈希算法计算得出的,只不过又将结果转换为了16进制 -
常用场景:日志输出、调试。
示例:
java复制代码Object obj = new Object();
System.out.println(obj.toString()); // 类名@哈希码
// 重写示例
@Override
public String toString() {
return "Custom String Representation";
}
1.4 clone()
clone()方法
-
clone是Java提供的一种方法,用来复制对象。
-
当你调用一个对象的
clone()方法时,它会创建一个新的对象。
为什么要实现cloneable接口
-
默认的
clone()方法由Object类定义。如果一个类希望支持克隆,它需要实现Cloneable接口,告诉 JVM:**“我支持克隆,你可以调用我的clone()方法。”** 否则,调用clone()方法时,会抛出CloneNotSupportedException异常。Cloneable是一个标记接口,不包含任何方法,只起到一个标记作用。
默认行为:浅拷贝
浅拷贝是 clone() 方法的默认行为,它的特点是:
1、基本数据类型——会直接复制值
2、引用数据类型——只会复制引用,说白了就是只会复制地址。
通俗地说:
-
浅拷贝创建的新对象的字段内容看起来一样,但是如果字段是引用类型,它们指向的是同一个内存地址。
-
改变引用类型字段的内容,会影响原对象和克隆对象。
如何实现深拷贝?
深拷贝是指,不仅要复制对象本身,还要复制对象引用类型字段指向的对象。 说白了就是克隆对象和原对象完全独立,修改一个不会影响另一个。
1.5 finalize()
在垃圾回收前调用,主要用于释放资源。不推荐使用,因为垃圾回收时间不确定。
-
不推荐的原因:垃圾回收不保证及时性,
finalize可能不被调用。
示例:
@Override
protected void finalize() throws Throwable {
System.out.println("Finalize called");
}
2. 线程相关方法
2.1 wait()
让当前线程进入等待状态,直到另一个线程调用 notify() 或 notifyAll()。
-
必须在同步块(
synchronized)中使用。 -
重载方法
-
wait():无限等待。 -
wait(long timeout):等待指定时间。 -
wait(long timeout, int nanos):等待精确时间。
-
2.2 notify()
唤醒在当前对象上等待的一个线程(随机唤醒一个)。
2.3 notifyAll()
唤醒在当前对象上等待的所有线程。
3. 其他方法
3.1 getClass()
返回对象的运行时类(Class 对象),用于反射——想要使用反射的话,第一步就是先获取类对象。
示例:
Object obj = new Object(); System.out.println(obj.getClass()); // class java.lang.Object
3.2 registerNatives()
这是 Object 类中的一个本地方法,用于 JVM 的内部初始化,不需要手动调用。
总结:Object 类的方法清单
| 方法名 | 功能描述 |
|---|---|
equals(Object obj) |
判断对象是否相等(默认是比较引用地址)。 |
hashCode() |
返回对象的哈希码(默认基于内存地址)。 |
toString() |
返回对象的字符串表示(默认是类名@哈希值)。 |
clone() |
返回对象的浅拷贝。 |
finalize() |
在垃圾回收前调用(不推荐使用)。 |
wait() |
使线程等待,直到被唤醒。 |
notify() |
唤醒在当前对象上等待的一个线程。 |
notifyAll() |
唤醒在当前对象上等待的所有线程。 |
getClass() |
返回对象的运行时类(反射时常用)。 |
面试准备提示
-
equals和hashCode的关系?-
如果两个对象相等(
equals返回true),它们的hashCode必须相等。(这是一种约定) -
hashCode不相等时,equals一定不相等。
-
-
toString在实际开发中的用途?-
用于调试和日志输出,重写
toString提供更有意义的信息。
-
-
wait()和sleep()的区别?-
wait()释放锁,必须在同步块中使用。 -
sleep()不释放锁,不需要同步块。
-
-
finalize为什么不推荐?-
垃圾回收时间不可控,
finalize可能导致资源泄漏或性能问题。
-
了解这些方法的用法、注意事项及典型面试问题,能帮助你在实际开发和面试中更加游刃有余
更多推荐
所有评论(0)