Java - Object类

482

Object类:

Object类是java中所有类的父类

java.lang.Object

native关键字:

被它修饰的叫本地方法, 没有实现体, JVM调用底层的C/C++代码实现

修饰符和返回值方法描述
public final native Class<?>getClass()获取字节码文件
public native inthashCode()获取对象的hashcode, 这里获取的并不一定是地址
public booleanequals(Object obj)比较对象地址
protected native ObjectObject clone() throws CloneNotSupportedException克隆对象, 对象拷贝, 必须实现一个Cloneable接口和处理异常, 同时要重写
public StringtoString()打印
public final native voidnotify()用于唤醒随机一个在此对象监视器上等待的线程
public final native voidnotifyAll()唤醒在该对象上等待的所有线程
public final voidwait()让当前线程进入等待状态. 直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法
protected voidfinalize()在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实现深拷贝有两种方法:

  1. 所有相关对象都实现浅拷贝
  2. 通过序列化对象实现深拷贝
所有相关对象都实现浅拷贝:
class User implements Cloneable {
    Cat cat = new Cat();
}

class Cat implements Cloneable {
    String name = "122";
}
通过序列化对象实现深拷贝:

对象 <-----> 字节数据

对象 <-----> 字符串数据 (如JSON)

再将字节数据转换成对象