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了本类对象),则会暂停类加载过程先执行实例化过程,
执行完毕再回到类加载过程