黑马程序员技术交流社区

标题: 初始化块的疑惑 [打印本页]

作者: 刘奇    时间: 2012-7-25 15:06
标题: 初始化块的疑惑
究竟什么是初始化块区域呢?一定要加上{}吗,如果只有一条赋值语句,也算是一个初始化快吗?
作者: 程潇    时间: 2012-7-25 15:29
你所说的初始化块,包括构造代码块和静态代码块
它们都是定义在类中,用大括号{}括起来,静态代码块在大括号外还要加上static关键字。

构造代码块:
作用:给对象进行初始化。对象一建立就运行,且优先于构造函数的运行。
与构造函数的区别:构造代码块给所有对象进行统一初始化,构造函数只给对应对象初始化。
应用:将所有构造函数共性的东西定义在构造代码块中。

静态代码块:
作用:给进行初始化。随着类的加载而执行,且只执行一次
与构造代码块的区别:
1)构造代码块用于初始化对象,每创建一个对象就会被执行一次;静态代码块用于初始化类,随着类的加载而执行,不管创建几个对象,都只执行一次。
2)静态代码块优先于构造代码块的执行
3)都定义在类中,一个带static关键字,一个不带static

构造函数、构造代码块、静态代码块都是用于初始化,三者的执行顺序依次是:
静态代码块>构造代码块>构造函数

举个例子:
Student{
    private String name;
    private int age;

    //静态代码块
    static {
        system.out.println("学生类的静态代码块");
    }

    //构造代码块
    {
        system.out.println("学生类的构造代码块");
    }

    //构造函数
    public Student(String name, int age){
       this.name = name;
        this.age = age;
    }

    public static void main(String[] args){
        Student stu1,stu2;
        stu1 = new Student("zhangsan",23);
        stu2 = new Student("lisi",22);
    }
}
通过这个例子,你可以观察静态代码块、构造代码块、构造函数的加载顺序


作者: 柳雷    时间: 2012-7-25 15:44
所谓初始化语块就是在一个类中对实变量作初始化的语块。他在构造对象时执行而且在构造器之前执行。
初始化语块的作用:
类体中只能定义实例变量和方法,不能直接写其它任何功能性的语句,赋值语句也不行(定义实例变量时显示初始化除外),
但因为可以有初始化块,所以可以在初始化块中写入功能性语句,通常这样的语句是用来在初始化的时候起一些作用。
另外Java中还有静态初始化块,即被static修饰的初始化块,用来对静态变量进行初始化。静态初始化块在类第一次加载时执行,而且只执行一次。

作者: 李菁    时间: 2012-7-26 01:11
其实初始化块就是构造器的补充,初始化块是不能接收任何参数的。可以在里面定义一些所有对象共有的属性、方法
Java初始化块有两种,一种是静态初始化块,另一种是非静态初始化块
静态初始化块:用static定义,当类装载到系统时执行一次
非静态初始化块:在每个对象生成时都会被执行一次,可以初始化类的实例变量
非静态初始化块会在构造函数主体代码执行之前被运行,括号里的是初始化块(所以必须有括号),里面的代码在创建java对象时执行,而且在构造器之前执行
作者: 姬仁贵    时间: 2012-7-26 06:43
本帖最后由 姬仁贵 于 2012-7-26 06:46 编辑

在Java中,有两种初始化块:静态初始化块和非静态初始化块.

静态初始化块:使用static定义,当类装载到系统时执行一次.若在静态初始化块中想初始化变量,那仅能初始化类变量,即static修饰的数据成员.

非静态初始化块:在每个对象生成时都会被执行一次,可以初始化类的实例变量.

非静态初始化块会在构造函数执行时,且在构造函数主体代码执行之前被运行.
括号里的是初始化块,这里面的代码在创建java对象时执行,而且在构造器之前执行!

其实初始化块就是构造器的补充,初始化块是不能接收任何参数的,定义的一些所有对象共有的属性、方法等内容时就可以用初始化块了初始化!!


初始化块与构造方法的作用很相似,他们都用于对Java对象执行指定的初始化块操作,但两者之间仍然存在着差异。具体差异在于:初始化块是一段固定的执行代码,他不能接收任何参数,因此初始化块对同一个类内的属性所进行的初始化处理完全相同;如果多个构造方法里有相同的初始化块,这些初始化代码无需接受参数,那就可以把他们放在初始化中定义。通过把多个构造方法中相同的代码提取到初始化块中定义,能更好的提高初始化块的复用,提高应用的可维护性
与构造方法类似,创建一个Java对象时,不仅会执行该类的初始化块和构造方法,系统还会一直追溯到java.lang.Object类,先执行java.lang.Object类的初始化块,执行java.lang.Object的构造方法,然后依次向下执行父类的初始化块,执行其父类的构造方法….最后才执行给类的初始化块和构造方法,返回该类的对象
如果希望类加载后对整个类执行某些初始化操作,则需要使用static关键字来修饰初始化块,使用static修饰的初始化块呗称为静态初始化块,静态初始化块是类相关的,静态初始化块必普通初始化块先执行

作者: sin    时间: 2012-7-26 10:22
初始化块就是一组一并初始化的代码,分为静态的的非静态的。就像楼上那哥们说的 就是构造器的补充




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2