疯狂java


您现在的位置: 疯狂软件 >> 新闻资讯 >> 正文

Java面向对象初始化代码块


 

   

  初始化代码块

  在18篇-类的基本要素中说到,类的三大成员:成员变量、构造方法、方法,初始化代码块是类的第4个成员

  初始化块用于对类或者对象的初始化,

  一个类的初始化块可以有0~多个,按先后顺序执行

  跟实例方法-->类方法、实例变量-->类变量一样,也可以用static修饰初始化块,静态初始化块-->非静态初始化块

  初始化块总是先于构造器执行

  非静态初始化块

  非静态初始化块相当于是对构造器的补充,用于创建对象时给对象的初始化,在构造器之间执行

  如果一段初始化代码对所有对象完全相同,且无需接收参数,那就可以将其提取到非静态初始化代码块中

  在继承中,先后执行父类A的非静态块、构造器,再执行父类B的非静态块、构造器,最后才执行子类的非静态块、构造器

  实际上,经过编译后,非静态块已经添加到构造器中,且位于所有构造器代码的前面

  静态初始化块

  静态初始化块用static修饰,又叫类初始化块

  非静态块负责对对象执行初始化,而类初始化块负责对类进行初始化,因此类初始化块是在类初始化阶段就执行

  静态块跟静态方法一样,不能访问非静态成员

  在继承中,先后执行父类A的静态块,父类B的静态块,最后子类的静态块,然后再执行父类A的非静态块和构造器,然后是B类,最后执行子类的非静态块和构造器

  因为静态块是在类的初始化阶段完成的,因此在创建某个类的第二个对象时,该类的静态块就不会执行了

  下面通过一段代码,看看继承中的静态块、非静态块、构造方法的执行顺序

  public class Test{

  public static void main(String[] args) {

  C c1=new C();

  System.out.println("--------下面第二次创建C类对象---------");

  C c2=new C();

  }

  }

  class C extends B{

  static {

  System.out.println("C的静态代码块");

  }

  {

  System.out.println("C的非静态代码块");

  }

  C(){

  System.out.println("C的无参构造方法");

  }

  C(String str){

  System.out.println("C的有参构造方法");

  }

  }

  class B extends A{

  static {

  System.out.println("B的静态代码块");

  }

  {

  System.out.println("B的非静态代码块");

  }

  B(){

  System.out.println("B的无参构造方法");

  }

  B(String str){

  System.out.println("B的有参构造方法");

  }

  }

  class A{

  static {

  System.out.println("A的静态代码块");

  }

  {

  System.out.println("A的非静态代码块");

  }

  A(){

  System.out.println("A的无参构造方法");

  }

  A(String str){

  System.out.println("A的有参构造方法");

  }

  }

  输出为:

  A的静态代码块

  B的静态代码块

  C的静态代码块

  A的非静态代码块

  A的无参构造方法

  B的非静态代码块

  B的无参构造方法

  C的非静态代码块

  C的无参构造方法

  --------下面第二次创建C类对象---------

  A的非静态代码块

  A的无参构造方法

  B的非静态代码块

  B的无参构造方法

  C的非静态代码块

  C的无参构造方法

  静态初始化块与静态成员变量的执行顺序

  JVM第一次使用某个类时,在准备阶段给所有静态成员分配内存,在初始化阶段初始化这些静态成员变量,就是执行初始化代码或者声明成员变量时指定的初始值,执行顺序与源代码中的顺序相同

  按源代码中的先后顺序执行,见示例代码:

  public class Test{

  public static void main(String[] args) {

  A a=new A();

  System.out.println(a.num); //输出10

  }

  }

  class A{

  public static int num=6;

  static{

  num=10;

  }

  }