java初始化顺序

来源:互联网 发布:如何优化产品 编辑:程序博客网 时间:2024/06/15 22:39

*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(intbase)被调用");
  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对象,访问非静态方法时的输出:");
  newChild().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的销毁方法被调用

0 0
原创粉丝点击