java类加载和初始化过程

public class Evis {
 	static Evis instance = new Evis();
 	static final String START = new String("START") + " " + Evis.END;
 	static final String END = "END";
 	static String start = new String("start") + " " + Evis.end;
 	static String end = "end";
 	final String _START = new String("_START") + " " + this._END;
 	final String _END = "_END";
 	String _start = new String("_start") + " " + this._end;
 	String _end = "_end";
 	String MESSAGE;
 	String message;
 	String _MESSAGE;
 	String _message;
	public Evis() {
  
		MESSAGE = "START = " + START + ", END = "  + END;
		this.message = "start = " + start + ", end = "  + end;
		_MESSAGE = "_START = " + _START + ", _END = "  + _END;
		this._message = "_start = " + _start + ", _end = "  + _end;
	}
	public void show() {
		System.out.println();
		System.out.println(this.MESSAGE);
		System.out.println(this.message);
		System.out.println(this._MESSAGE);
		System.out.println(this._message);
	}
	public static void main(String[] args) {
		//递归的初始化尝试会直接被忽略掉
		Evis.instance.show();
	}
}

 输出为:

START = null, END = END
start = null, end = null
_START = _START _END, _END = _END
_start = _start null, _end = _end

 * 递归的初始化尝试会直接被忽略掉
 * 类加载和实例初始化时,分配空间并设置缺省值时,会将final变量中使用常量或常量表达式赋值的变量

   直接设置为常量值而不是缺省值。
 * 类加载初始化时:
   static final 类型的域在未初始化之前被引用,只有在其初始化表达式是常量或常量表达式时才是常量值,

   否则为缺省值。
   static 类型的域在未初始化之前被引用,为缺省值。
   通常在声明之前直接引用会引发编译错误,可以用 ClassName.引用。
 * 类实例初始化时:
   final 类型的实例域在未初始化之前被引用,只有在其初始化表达式是常量或常量表达式时才是常量值,

   否则为缺省值。
   普通类型的实例域在未初始化之前被引用,为缺省值。
   通常在声明之前直接引用会引发编译错误,可以用this.引用。

public enum RomanNumeral {

    I(1), V(5), X(10), L(50), C(100), D(500), M(1000);
    private static Map<Integer, RomanNumeral> map = new LinkedHashMap<Integer, RomanNumeral>();
    public final int val;

    RomanNumeral(int val) {
        this.val = val;
        storeInMap();
    }

    private void storeInMap() {
        map.put(val, this);
    }

    public static RomanNumeral fromInt(int val) {
        return map.get(val);
    }

    public static void main(String[] args) {
        int sum = 0;
        for (int i = 0; i < 1000; i++) {
            if (fromInt(i) != null) {
                sum += i;
            }
        }
        System.out.println(sum);
    }
}

 输出为:

Exception in thread "main" java.lang.ExceptionInInitializerError
Caused by: java.lang.NullPointerException
 at com.jaeson.javastudy.thinkinjava.RomanNumeral.storeInMap(RomanNumeral.java:18)
 at com.jaeson.javastudy.thinkinjava.RomanNumeral.<init>(RomanNumeral.java:14)
 at com.jaeson.javastudy.thinkinjava.RomanNumeral.<clinit>(RomanNumeral.java:8)

 * 类加载过程(静态属性、静态方法声明-----静态属性赋值、静态块)
 * 实例化过程(普通属性、普通方法声明-----普通属性赋值、构造块----构造方法中的代码)
 * 如果在类加载过程中调用了实例化过程(如new了本类对象),则会暂停类加载过程先执行实例化过程,

   执行完毕再回到类加载过程

public enum RomanNumeral {

    I(1), V(5), X(10), L(50), C(100), D(500), M(1000);
    private static Map<Integer, RomanNumeral> map = new LinkedHashMap<Integer, RomanNumeral>();
    public final int val;

    RomanNumeral(int val) {
        this.val = val;
        storeInMap();
    }

    private void storeInMap() {
        map.put(val, this);
    }

    public static RomanNumeral fromInt(int val) {
        return map.get(val);
    }

    public static void main(String[] args) {
        int sum = 0;
        for (int i = 0; i < 1000; i++) {
            if (fromInt(i) != null) {
                sum += i;
            }
        }
        System.out.println(sum);
    }
}

 输出为:

Exception in thread "main" java.lang.ExceptionInInitializerError
Caused by: java.lang.NullPointerException
 at com.jaeson.javastudy.thinkinjava.RomanNumeral.storeInMap(RomanNumeral.java:18)
 at com.jaeson.javastudy.thinkinjava.RomanNumeral.<init>(RomanNumeral.java:14)
 at com.jaeson.javastudy.thinkinjava.RomanNumeral.<clinit>(RomanNumeral.java:8)

 * 类加载过程(静态属性、静态方法声明-----静态属性赋值、静态块)
 * 实例化过程(普通属性、普通方法声明-----普通属性赋值、构造块----构造方法中的代码)
 * 如果在类加载过程中调用了实例化过程(如new了本类对象),则会暂停类加载过程先执行实例化过程,

   执行完毕再回到类加载过程

猜你喜欢

转载自jaesonchen.iteye.com/blog/2287626