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对象中的Cat对象还是指向堆中同一块内存
优点: 内存占用较少
缺点: 如果存在子对象, 则子对象没有拷贝, 还是指向同一个
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)
再将字节数据转换成对象