Java - Object类
Object类:
Object 类是 java 中所有类的父类
java.lang.Object
native关键字:
被它修饰的叫本地方法, 没有实现体, JVM 调用底层的 C/C++ 代码实现
修饰符和返回值 | 方法 | 描述 |
---|---|---|
public final native Class<?> | getClass() | 获取字节码文件 |
public native int | hashCode() | 获取对象的 hashcode, 这里获取的并不一定是地址 |
public boolean | equals(Object obj) | 比较对象地址 |
protected native Object | Object clone() throws CloneNotSupportedException | 克隆对象, 对象拷贝, 必须实现一个 Cloneable 接口和处理异常, 同时要重写 |
public String | toString() | 打印 |
public final native void | notify() | 用于唤醒随机一个在此对象监视器上等待的线程 |
public final native void | notifyAll() | 唤醒在该对象上等待的所有线程 |
public final void | wait() | 让当前线程进入等待状态. 直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法 |
protected void | finalize() | 在 gc 触发前会自动触发, 用于做一些 gc 触发前的各种工作 |
对象拷贝:
引用拷贝只拷贝栈引用地址, 而对象拷贝则是在堆中拷贝出一个新对象
浅拷贝:
将对象的第一层完成拷贝, 对两个对象完成了基本的分离, 有可能还存在着藕断丝连
例如对象 User 中有一个 Cat 对象, 这时浅拷贝只会拷贝出一个新的 User 对象, 而两个User 对象中的 Ca t对象还是指向堆中同一块内存
优点: 内存占用较少
缺点: 如果存在子对象, 则子对象没有拷贝, 还是指向同一个
class User implements Cloneable {
public static void main(String[] args) {
User user1 = new User();
User user2 = null;
user2 = user1;
System.out.println(user2 == user1);
user2 = user1.clone();
System.out.println(user1 == user2);
}
@Override
public User clone() {
try {
return (User) super.clone();
} catch (CloneNotSupportedException e) {
throw new AssertionError();
}
}
}
深拷贝:
也叫递归拷贝. 将两个对象完全分离, 彼此之间无任何联系
java实现深拷贝有两种方法:
- 所有相关对象都实现浅拷贝
- 通过序列化对象实现深拷贝
所有相关对象都实现浅拷贝:
class User implements Cloneable {
Cat cat = new Cat();
}
class Cat implements Cloneable {
String name = "122";
}
通过序列化对象实现深拷贝:
对象 <-----> 字节数据
对象 <-----> 字符串数据 (如JSON)
再将字节数据转换成对象