java学习笔记
整理 Java 静态初始化、内部类、枚举、对象构造及相关运行时行为。
static语句块
static{}(即static块),会在类被加载的时候执行且仅会被执行一次,一般用来初始化静态变量和调用静态方法. 在程序的执行过程中,static{}语句块中的内容只被执行一次
执行时机
static{}会在类被加载的时候执行, 具体一点来说:
-
用Class.forName()加载的时候
-
实例化一个类的时候
-
调用类的静态方法的时候
-
调用类的静态变量的时候
注意 一是调用类的静态常量的时候,是不会加载类的, 这是Java虚拟机的规定 二是用Class.forName()形式的时候,可以设定要不要加载类,如有一个类Test, 将Class.forName(“Test”)改为 Class.forName(“Test”,false,StaticBlockTest.class.getClassLoader()) 则Test不会被加载,static{}不会被执行
执行顺序
1、当一个类中有多个static{}的时候,按照static{}的定义顺序,从前往后执行 2、先执行完static{}语句块的内容,才会执行调用语句 3、如果静态变量在定义的时候就赋给了初值(如 static int X=100),那么赋值操作也是在类加载的时候完成的,并且当一个类中既有static{}又有static变量的时候,遵循“先定义先执行”的原则
关于“inner classes cannot have static declarations”
普通内部类不能有static的字段与方法, 但可以声明static final的常量
class StaticTest { private class A1 { private static final int a = 1; // OK private static final String b = "shit"; // OK private static final Integer c = 1; //Fail private static final Object d = new Object(); //Fail private static final String e = new String("bump");//Fail }
private static class A2 { private static final Object a2 = new Object(); // OK }
}enum
JDK1.5开始提供enum特性, 能把相关的常量分组到一个枚举类型中,而且枚举提供了比常量更多的方法
public enum Color { RED("红色", 1), GREEN("绿色", 2), BLANK("白色", 3), YELLO("黄色", 4); // 成员变量 private String name; private int index;
// 构造方法, 注意是私有的 private Color(String name, int index) { this.name = name; this.index = index; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public int getIndex() { return index; }
public void setIndex(int index) { this.index = index; }
}由于所有的枚举都继承自java.lang.Enum类。由于Java 不支持多继承,所以枚举对象不能再继承其他类
参考:http://www.cnblogs.com/happyP…