java初始化顺序

    xiaoxiao2021-04-19  76

    *java虚拟机先加载父类,再加载子类。

    *在加载类时,会对静态初始化块、静态成员变量(类变量)、静态方法进行一次初始化。

    *只有在调用new方法时才会创建类的对象。

    *创建对象的过程是:按照父类继承关系进行初始化,首先执行父类的初始化块部分,后是父类的构造方法,再执行子类的初始化块,最后是子类的构造方法。

    *销毁对象的过程是:首先销毁子类部分,再销毁父类部分。

     

    看下面代码:

    父类:

    public class Parent {  private int ix = 50;

     private static int iz = getNext(30);    {   System.out.println("Parent的初始化块");   int x = 100;   int y = getNext(100);  }    static {   System.out.println("Parent的静态初始化块");   int sx = 100;   int sy = getNext(100);  }    public Parent() {   System.out.println("Parent的构造方法被调用");  }  public void display() {   System.out.println("Parent的display方法被调用");   System.out.print("ix=" + this.ix);   System.out.println("; iz=" + iz);   dispA();  }  public static void dispA() {   System.out.println("Parent的dispA()被调用");  }  public static int getNext(int base) {   System.out.println("Parent的getNext(int base)被调用");   return ++base;  }    protected void finalize() {   System.out.println("Parent的销毁方法被调用");  } }

    子类:

    public class Child extends Parent {  {   System.out.println("Child的初始化块");   int bx = 100;  }  static {   System.out.println("Child的静态初始化块");  }  public Child() {   super();   System.out.println("Child的构造方法被调用");  }  public static void dispB(){   System.out.println("Child的dispB()被调用");  }    protected void finalize() {   System.out.println("Child的销毁方法被调用");   super.finalize();  } }

    测试类:

    package book.oo.initorder;

    public class ClassInitOrderTest {

     public static void main(String[] args) {   System.out.println("不new对象,访问静态方法时的输出:");   Child.dispB();   System.out.println();   System.out.println("new对象,访问非静态方法时的输出:");   new Child().display();   //通知虚拟机进行垃圾回收   System.gc();  }

    }

    程序输出://保留main方法的前2行程序,将后面的注释,得到的输出结果是如下: // 不new对象,访问静态方法时的输出: // Parent的静态初始化块 // Parent的getNext(int base)被调用 // Parent的getNext(int base)被调用 // Child的静态初始化块 // Child的dispB()被调用   //将main方法的前3行程序注释,保留后面的程序,得到的输出结果如下: // new对象,访问非静态方法时的输出: // Parent的静态初始化块 // Parent的getNext(int base)被调用 // Parent的getNext(int base)被调用 // Child的静态初始化块 // Parent的初始化块 // Parent的getNext(int base)被调用 // Parent的构造方法被调用 // Child的初始化块 // Child的构造方法被调用 // Parent的display方法被调用 // ix=50; iz=31 // Parent的dispA()被调用 // Child的销毁方法被调用 // Parent的销毁方法被调用

    转载请注明原文地址: https://ju.6miu.com/read-675937.html

    最新回复(0)