转载

3.java类和对象

关于类和对象的详解可以参考: https://blog.csdn.net/wei_zhi...

本文主要记录下类对象的初始化顺序、finalize函数以及对象克隆。

类对象初始化顺序

  1. 父类静态属性变量初始化
  2. 父类静态代码块
  3. 子类静态属性变量初始化
  4. 子类静态代码块
  5. 父类普通属性变量初始化
  6. 父类构造代码块
  7. 父类构造函数
  8. 子类普通属性变量初始化
  9. 子类构造代码块
  10. 子类构造函数

通过结论我们可以很明显的看出: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
原文  https://segmentfault.com/a/1190000018319889
正文到此结束
Loading...