关于类和对象的详解可以参考: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
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。