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.