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