初始化的顺序
在类中变量定义的顺序决定了它们初始化的顺序。即使变量定义散布在方法定义之间,它们仍会在任何方法(包括构造器)被调用之前得到初始化。
静态数据的初始化
无论创建多少个对象,静态数据都只占用一份存储区域。static 关键字不能应用于局部变量,所以只能作用于属性(字段、域)。如果一个字段是静态的基本类型,你没有初始化它,那么它就会获得基本类型的标准初值。如果它是对象引用,那么它的默认初值就是 null。
如果在定义时进行初始化,那么静态变量看起来就跟非静态变量一样。
书中这句话存疑(此篇博客答疑了https://blog.csdn.net/qq_17864929/article/details/48006835)
静态初始化只有在必要时刻才会进行。只有在第一个对象被创建(或静态变量被访问)时,它们才会被初始化。此后,静态对象不会再次被初始化。
显式的静态初始化
静态代码块 实际上它只是一段跟在 static 关键字后面的代码块。与其他静态初始化动作一样,这段代码仅执行一次:当首次创建这个类的对象或首次访问这个类的静态成员(甚至不需要创建该类的对象)
非静态实例初始化
非静态代码块 在构造器之前执行的。
动态数组创建
使用 new 创建基本类型数组。new 不能创建非数组以外的基本类型数据
new int[rand.nextInt(20)];
可变参数列表
以创建一个以 Object 数组为参数的方法
static void printArray(Object[] args) {
for (Object obj: args) {
System.out.print(obj + " ");
}
}
public static void main(String[] args) {
printArray(new Object[] {"one", "two", "three"});
}
编译器都会使用自动装箱来匹配重载的方法,然后调用最明确匹配的方法
static void f(son... args) {
System.out.println("first");
}
static void f(father... args) {
System.out.println("second");
}
public static void main(String[] args) {
f(new son());
}
输出为 first
枚举类型
由于枚举类型的实例是常量,因此按照命名惯例,它们都用大写字母表示(如果名称中含有多个单词,使用下划线分隔)
由于 switch 是在有限的可能值集合中选择,因此它与 enum 是绝佳的组合
我们使用enum定义的枚举类型,会在编译之后转化为一个继承了java.lang.Enum的类,而我们定义的每个枚举值都会在类的初始化阶段被实例化为我们所定义的枚举类的一个对象。