关于JAVA Static的初始化顺序(及递归错误)

来源:互联网 发布:python实现二叉树 编辑:程序博客网 时间:2024/05/18 01:37
 

package com.cisco.learning;

class ClassOne{
 
 //去掉static将产生StackOverflowError
 //因为有了静态修饰,导致不会第二次初始化。
 private static ClassOne classOne=new ClassOne();
 
 ClassOne(){
  System.out.println("ClassOne Constructor");
 }
}

class ClassTwo{
 
 private static int i=getMethod();

 private static int getMethod() {
  // TODO Auto-generated method stub
  System.out.println("ClassTwo static");
  return 0;
 }
 
}

public class CopyOfTestStatic {

 /**
  * @param args
  */
 public static void main(String[] args) {
  new ClassOne();
  System.out.println("________");
  new ClassOne();
  }
 
 //没有打印ClassTwo static,说明没有创建对象时(或访问静态域),不会初始化静态成员
 /*//
  * ClassOne Constructor
 ClassOne Constructor
 说明先初始化了静态域,而且以后不再初始化,所以不会产生递规StackOverflowError。
 ________
 ClassOne Constructor*/

}

 

package com.cisco.learning;

import java.util.Calendar;

public class Elvis {
 private static final int i=10;
 public static final Elvis INSTANCE = new Elvis();
 private final int beltSize;
 private static final int CURRENT_YEAR = Calendar.getInstance().get(
   Calendar.YEAR);

 private Elvis() {
  System.out.println(i);
  beltSize = CURRENT_YEAR - 1930;
 }

 public int beltSize() {
  return beltSize;
 }
 
/* 10
 Elvis wears a size -1930 belt.
 说明,当访问静态域或者NEW()时,Class的静态部分就开始初始化;*/
 public static void main(String[] args) {
  System.out.println("Elvis wears a size " + INSTANCE.beltSize()
    + " belt.");
 }
}

 

原创粉丝点击