代码块的优先级要比构造函数高,new对象前先去硬盘读取自解码,完成类的初始化-加载静态,而后new了对象就完成属性方法的初始化(先加载代码块再加载构造方法),因此new第二个对象的时候就不会再初始化类了(不用再加载一遍静态代码块)函数
public class Person { public final String name; public int age; public Person() { System.out.println("无参构造方法"); } { System.out.println("代码块2"); } { System.out.println("代码块1"); name = "小明"; } static { System.out.println("静态代码块2"); } static { System.out.println("静态代码块1"); } public Person(int age) { this.age = age; //this.name = ""; System.out.println("构造age方法"); } public void goToSchool() { System.out.println(name + "goToSchool方法"); } }
public class TestPerson { public static void main(String args[]) { Person person = new Person(); Person person2 = new Person(); } } 静态代码块2 静态代码块1 代码块2 代码块1 无参构造方法 代码块2 代码块1 无参构造方法