关于类和对象的详解可以参考:https://blog.csdn.net/wei_zhi…
本文主要记录下类对象的初始化顺序、finalize 函数以及对象克隆。
类对象初始化顺序
父类静态属性变量初始化
父类静态代码块
子类静态属性变量初始化
子类静态代码块
父类普通属性变量初始化
父类构造代码块
父类构造函数
子类普通属性变量初始化
子类构造代码块
子类构造函数
通过结论我们可以很明显的看出:static 字段、代码块的执行顺序优先于非 static 字段、代码块。这是因为在静态域是属于类的,在类加载后就一直存在;而普通域需要创建对象才能访问。而在创建对象时,需要先加载父类,然后再加载子类,因此父类的静态字段初始化和静态代码块执行先于子类。
finalize 析构函数
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(); // 手工处理垃圾收集
}
}
输出结果:
对象构造函数
对象析构函数
可以看到异常信息并未输出。
final、finally、finalize 的区别
final:关键字,其修饰的类不能被继承,方法不能被重写、常量;
finally:关键字,异常的统一出口;
finalize:Object 类的方法,析构函数;
对象克隆
对象克隆指的是对象的复制操作,在 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