(转) Java 静态代码块和非静态代码块

参考:http://uule.iteye.com/blog/1558891

Java中的静态代码块是在虚拟机加载类的时候,就执行的,而且只执行一次。如果static代码块有多个,JVM将按照它们在类中出现的先后顺序依次执行它们,每个代码块只会被执行一次。

非静态代码块是在类new一个实例的时候执行,而且是每次new对象实例都会执行。

代码的执行顺序

  1. 主调类的静态代码块
  2. 对象父类的静态代码块
  3. 对象的静态代码块
  4. 对象父类的非静态代码块
  5. 对象父类的构造函数
  6. 对象的非静态代码块
  7. 对象的构造函数

示例代码

public class StaticBlockTest1 {

    //主调类的非静态代码块
    {
        System.out.println("StaticBlockTest1 not static block"); } //主调类的静态代码块 static { System.out.println("StaticBlockTest1 static block"); } public StaticBlockTest1(){ System.out.println("constructor StaticBlockTest1"); } public static void main(String[] args) { Children children = new Children(); children.getValue(); } } class Parent{ private String name; private int age; //父类无参构造方法 public Parent(){ System.out.println("Parent constructor method"); { System.out.println("Parent constructor method--> not static block"); } } //父类的非静态代码块 { System.out.println("Parent not static block"); name = "zhangsan"; age = 50; } //父类静态代码块 static { System.out.println("Parent static block"); } //父类有参构造方法 public Parent(String name, int age) { System.out.println("Parent constructor method"); this.name = "lishi"; this.age = 51; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } } class Children extends Parent{ //子类静态代码块 static { System.out.println("Children static block"); } //子类非静态代码块 { System.out.println("Children not static block"); } //子类无参构造方法 public Children(){ System.out.println("Children constructor method"); } public void getValue(){ //this.setName("lisi"); //this.setAge(51); System.out.println(this.getName() + this.getAge()); } }

输出结果

StaticBlockTest1 static block   //主调类的静态代码块
Parent static block //父类的静态代码块 Children static block //子类的静态代码块 Parent not static block //父类的非静态代码块 Parent constructor method //父类的构造函数 Parent constructor method--> not static block Children not static block //主调类的非静态代码块 Children constructor method //主调类的构造函数 zhangsan50 //主调main方法
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

总结:

  1. 按照前面提到的顺序执行
  2. 子类定义无参构造方法,调用的父类也是无参构造方法

猜你喜欢

转载自www.cnblogs.com/Dar-/p/9059684.html