1.初始化块的作用:对java对象进行初始化;
2.程序的执行顺序:声明成员变量的默认值-->显示初始化,多个初始化块依次被执行(同级别下按先后顺序执行)-->构造器在对成员进行赋值操作。
public class Person extends Object{ String name; public Person() { this.name = "tom"; System.out.println("执行的是构造方法"); } { System.out.println("执行的是非静态代码块"); } }
public class Main { public static void main(String[] args) { Person p = new Person(); } }
输出:
执行的是非静态代码块1
执行的是非静态代码块2
执行的是构造方法
3.静态代码块:当类在被载入时,类属性的声明和静态代码快先后顺序被执行,且只被执行一次;静态代码块里面只能用static修饰的属性和方法;
package insof; public class Person extends Object{ String name; static int age; public Person() { this.name = "tom"; System.out.println("执行的是构造方法"); } { System.out.println("执行的是非静态代码块1"); } { System.out.println("执行的是非静态代码块2"); } static{ age = 11; System.out.println("执行的是静态代码块1"); showAge(); } static{ System.out.println("执行的是静态代码块2"); } public static void showAge() { System.out.println(age); } }
package insof; public class Main { public static void main(String[] args) { Person p = new Person(); Person p1 = new Person(); } }
输出:
执行的是静态代码块1
11
执行的是静态代码块2
执行的是非静态代码块1
执行的是非静态代码块2
执行的是构造方法
执行的是非静态代码块1
执行的是非静态代码块2
执行的是构造方法
说明:每次new一个对象,给静态代码块都要被执行,而静态代码块只执行一次。
非静态代码块:
- 可以有输出语句;
- 可以对类的属性声明进行初始化操作;
- 可以调用静态和非静态的属性和方法;
- 若有多个非静态的代码块,那么按照从上到下的顺序一次执行;
- 每次创建对象的时候,都只会执行一次,且优先于构造方法;
静态代码块:用static修饰的代码块
- 可以有输出语句;
- 可以对类的属性声明进行初始化操作;
- 不可以对非静态的属性初始化,即:不可以调用非静态的属性和方法;
- 静态代码块的执行顺序优先于非静态代码块;
- 静态代码块只执行一次;