关于类和对象的详解可以参考: https://blog.csdn.net/wei_zhi...
本文主要记录下类对象的初始化顺序、finalize函数以及对象克隆。
通过结论我们可以很明显的看出:static字段、代码块的执行顺序优先于非static字段、代码块。这是因为在静态域是属于类的,在类加载后就一直存在;而普通域需要创建对象才能访问。而在创建对象时,需要先加载父类,然后再加载子类,因此父类的静态字段初始化和静态代码块执行先于子类。
java对象也有类似析构函数的功能,如果想要在垃圾回收的时候对某个对象进行一些收尾工作,可以重写Object类的 finalize()
方法。
定义如下:
protected void finalize() throws Throwable
在对象回收时,即使抛出了异常,也不会影响程序的正常运行。
示例:
class Demo { public Demo(){ System.out.println("对象构造函数"); } @Override protected void finalize() throws Throwable{ System.out.println("对象析构函数"); } } public class testDemo { public static void main(String[] args) throws Exception { Demo demo = new Demo(); demo = null; //会产生垃圾 System.gc(); //手工处理垃圾收集 } } 输出结果: 对象构造函数 对象析构函数
可以看到异常信息并未输出。
对象克隆指的是对象的复制操作,在Object类里提供有一个专门的克隆方法:
protected Object clone() throws CloneNotSupportedException
如果要使用的对象不支持Cloneable接口,调用该方法就会抛出异常。
示例:
class Book implements Cloneable { //此类的对象可以被克隆 private String title; private double price; public Book(String title, double price){ this.title = title; this.price = price; } @Override public String toString(){ return "书名:" + this.title + "价格:" + this.price; } //由于此类需要对象克隆操作,需要进行对象方法的重写 @Override public Object clone() throws CloneNotSupportedException{ return super.clone(); } } public class testDemo { public static void main(String[] args) throws Exception { Book bookA = new Book("java开发", 79.8); Book bookB = (Book)bookA.clone(); System.out.println(bookA); System.out.println(bookB); System.out.println(System.identityHashCode(bookA)); System.out.println(System.identityHashCode(bookB)); } } 输出结果: 书名:java开发价格:79.8 书名:java开发价格:79.8 ***** 366712642 1829164700