Object类简介

Object是java默认提供的一个类. java里面除了Object类, 所有的类都是存在继承关系的. Object是所有类的父类, 任何类都默认继承Object. 由于所有的类都继承在Object类, 因此省略了extends Object关键字. 

该类的主要方法有 : clone(), toString(), getClass(), finalize(), equals(), 还有hashCode(), wait(), notify(), notifyAll()等

注意 : Obj类中的getClass(), notify(), notifyAll(), wait()等方法被定义为final类型, 因此不可以覆写

一. clone()方法 : 快速创建一个已有对象的副本

1. Obj类的clone()方法是一个native方法, native方法的效率一般来说都是远高于java中的非native方法. 这就解释了为什么要用Obj中clone()方法而不是先new一个类, 然后再把原始对象中的信息复制到新对象中, 虽然这也实现了clone功能.

2. Obj类中的clone()方法被protected修饰符修饰, 这也意味着如果要用clone()方法, 必须继承Obj类

3. Object.clone()方法返回一个Obj对象. 我们必须进行强制类型转换才能得到我们需要的类型

 

克隆的步骤 : 创建一个对象 -> 将原有对象的数据导入到新创建的数据中.

clone方法首先会判断对象是否实现了Cloneable接口, 若无则抛出CloneNotSupportedException, 最后会调用internalClone.

对象复制&引用复制

先来看一段代码

public class Demo {
    public static void main(String[] args) {
        Person p = new Person(18, "jack");
        Person p1 = p;
        System.out.println(p);
        System.out.println(p1);
    }
}

它的运行结果是 : 

com.bittech.test.Person@1540e19d
com.bittech.test.Person@1540e19d

可以清晰的看出, 打印的地址是相同的, 地址相同就代表了是同一个对象. p和p1是引用, 他们指向了相同的对象Person(18,"jack")这种现象叫引用的复制

再来看一段代码 :

Person p = new Person(18, "jack");
Person p1 = (Person) p.clone();
System.out.println(p);
System.out.println(p1);

运行结果 : 

com.bittech.test.Person@1540e19d
com.bittech.test.Person@677327b6

从结果可以明显看出, 两个对象的地址是不同的, 也就是说创建了新的对象, 而不是把原对象的地址赋给了一个新的引用变量

深拷贝与浅拷贝 : 

二. toString()方法 : 

Obj类的toString方法返回一个字符串, 该字符串由类名(对象是该类的一个实例), 标识符 "@" 和此对象哈希码的无符号十六进制表示组成. 

此方法用的比较多, 一般子类都有覆盖

public String toString(){
    return getClass().getName()+"@"+Integer.toHexString(hashCode());

}

例子:

public class Demo {
    public static void main(String[] args) {
        Object o = new Object();
        System.out.println(o.toString());
    }
}

运行结果: java.lang.Object@1540e19d

三 . getClass()方法 : 

public final native Class<?> getClass();

返回Obj的运行时类类型

不可覆写, 要强调用的话, 一般和getName()联合使用. 如getClass().getName();

四 . finalize()方法 : 

protected void finalize() throws Throwable {
    
    }

该方法用于释放资源, 因为无法确定该方法什么时候被调用, 很少使用.

java允许在类中定义一个finalize()方法, 它的工作原理是 : 一旦垃圾回收器准备好释放对象占用的储存空间, 将首先调用其finalize()方法, 并且在下一次垃圾回收动作发生时, 才会真正回收对象占用的内存

1. 对象可能不被垃圾回收, 只要程序没有濒临存储空间用完的那一刻, 对象占用的空间就总也得不到释放

2. 垃圾回收并不等于"析构"

3. 垃圾回收只与内存有关. 使用垃圾回收的唯一原因是为了回收程序不再使用的内存.

4. 垃圾回收和finalize()都是靠不住的, 只要JVM还没有快到耗尽内存的地步, 它是不会浪费时间进行垃圾回收的

五 . equals()方法 


简单的说Obj中的equals方法是直接判断this和obj本身的值是否相等(引用对象是否是同一对象) 是否为同一对象就是指对象指向是否为同一块内存, 如果是就返回true, 不是就返回false.