初始化块

初始化块

 
对Java 对象进行初始化操作有两种办法

1、使用构造器先完成整个 Java 对象的状态初始化,

然后将 Java 对象返回给程序,但是构造器是对单个对象进行初始化操作

2、初始化代码块,也可以对java对象初始化

初始化块是 Java 类里可出现的第四种成员(前面依次有成员变量、方法和构造器)

一个类里可以有多个初始化块,相同类型的初始化块之间有顺序 前面定义的初始化块先执行,后面定义的初始化块后执行
 
 

[修饰符] { 
//初始化块的可执行性代码
    .......
}

 

初始化块的修饰符只能是static 使用 static 修饰的初始化块被称为静态初始化块

初始化块里的代码可以包含任何可执行性语句,包括定义局部变量、调用其他对象的方法,以及使用分支、循环语句等

 
 

public class Person {
    {
        int a = 6;
        if (a > 4) {
            System.out.println("Person初始化块 局部变量 的值大子 4");
        }
        System.out.println("Person 的第一个初始化块 ");
    }
//定义第二个初始化块
    {
        System.out.println( "Person 的第二个初始化块") ;
    }

//定义无参数的构造器
 public Person (){
     System.out.println("Perso类的无参数构造器");
  }

  public static void main(String[] args){
        new Person();
    }
}

 

 

Person初始化块 局部变量 的值大子 4
Person 的第一个初始化块 
Person 的第二个初始化块
Perso口类的无参数构造器

Process finished with exit code 0

 
当创建 Java 对象时,系统总是先调用该类里定义的初始化块,如果一个类

里定义了多个普通初始化块,则前面定义的初始化块先执行,后面定义的初始化块后执行

初始化块虽然也是 Java 类的一种成员,但它没有名字,也就没有标识,因此无法通过类、对象来调用初始化块

初始化块只在创建 Java 对象时隐式执行,而且在执行构造器之前执行

 

虽然 Java 允许一个类里定义多个普通初始化块,但这没有任何意义 因为初始化块

是在创建 Java 对象时隐式执行的,而且它们总是全部执行,因此完全可以把多个普通初

始化块合并成一个初始化块,从而可以让程序更加简洁,可读性更强

 
 

初始化代码块与构造方法区别

普通初始化块、声明实例变量指定的默认值都可认为是对象的初始化代码,它们的执行顺序与源程序中的排列顺序相同

public class Person {
    /**
     * 先执行初始化块将 实例变量赋值为6
     * 再执行将 实例变量赋值为9
     */

    {
         a = 6 ;
    }
      int a = 9;

  public static void main(String[] args){
      System.out.println(new Person().a);
    }

    /**
     * 定义了两次对 a 实例变量赋值,执行结果a实例变量的值为9,
     * 这表明 int a = 9这行
     * 代码比初始化块后执行
     * 但如果a = 6 与 int a = 9 的顺序调换一下,
     * 可以看到程序输出的实例变量的值为6 ,
     * 这是由于初始化块中代码再次将 a实例变量的值设为6
     */
}

 
在这里插入图片描述

 

从某种程度上来看,初始化块是构造器的补充,初始化块总是在构造器执行之前执行。系统同样可使用初始化块来进行对象的初始化操作

与构造器不同的是,初始化块是一段固定执行的代码,它不能接收任何参数

因此初始化块对同一个类的所有对象所进行的初始化处理完全相同 。

基于这个原因,不难发现初始化块的基本用法,
 
如果有一段初始化处理代码对所有对象完全相同,且无须接收任何参数 ,就可以把这段初始化处理代码提取到初始化块中

 

在这里插入图片描述
 
 

如果两个构造器中有相同的初始化代码,且这些初始化代码无须接收参数,

就可以把它们放在初始化块中定义

通过把多个构造器中的相同代码提取到初始化块中定义,

能更好地提高初始化代码的复用,提高整个应用的可维护性

 
 
在这里插入图片描述

 

与构造器类似,创建 Java 对象时,不仅会执行该类的普通初始化块和构造器,而且系统会一直上溯到java.lang.Object类,先执行 java .lang.Object 类的初始化块,

同样类似的还有(

系统在类初始化阶段执行静态初始化块时,不仅会执行本类的静态初始化块,而且还会一直上溯到 java.lang.Object 类(如果它包含静态初始化块)
 

 
再开始执行 java .lang.Object 的构造器,依次向下执行其父类的初始化块,

开始执行其父类的构造器……最后才执行该类的初始化块和构造器,返回该类的对象

除此之外,如果希望类加载后对整个类进行某些初始化操作,

例如当 Person 类加载后,则需要把Person 类的 eyeNumber 类变量初始化为2 ,此时需要使用static关键字来修饰初始化块,使用 static饰的初始化块被称为静态初始化块。

 

public class Person {
 static eyeNumber = 2;
 int age;   
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值