`
isiqi
  • 浏览: 16088993 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

初始化块

 
阅读更多


初始化块与构造方法的作用很相似,他们都用于对Java对象执行指定的初始化块操作,但两者之间仍然存在着差异。具体差异在于:初始化块是一段固定的执行代码,他不能接收任何参数,因此初始化块对同一个类内的属性所进行的初始化处理完全相同;如果多个构造方法里有相同的初始化块,这些初始化代码无需接受参数,那就可以把他们放在初始化中定义。通过把多个构造方法中相同的代码提取到初始化块中定义,能更好的提高初始化块的复用,提高应用的可维护性

与构造方法类似,创建一个Java对象时,不仅会执行该类的初始化块和构造方法,系统还会一直追溯到java.lang.Object类,先执行java.lang.Object类的初始化块,执行java.lang.Object的构造方法,然后依次向下执行父类的初始化块,执行其父类的构造方法….最后才执行给类的初始化块和构造方法,返回该类的对象

如果希望类加载后对整个类执行某些初始化操作,则需要使用static关键字来修饰初始化块,使用static修饰的初始化块呗称为静态初始化块,静态初始化块是类相关的,静态初始化块必普通初始化块先执行

编写程序,创建Father,Me,Sun3个类,这三个类都提供了静态初始化块和普通初始化块,并且Me类里还是用了this调用重载构造方法,而Sun使用了super显示调用父类指定的构造方法,代码如下:

class Father{

static {

System.out.println("老爸的初始化块");

}

{

System.out.println("老爸的普通初始化块");

}

public Father(){

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

}

}

class Me extends Father{

static{

System.out.println("我的静态初始化块");

}

{

System.out.println("我的普通初始化块");

}

public Me(){

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

}

public Me(String s){

this();

System.out.println("我的带参数构造方法,参数是"+s);

}

}

class Sun extends Me{

static{

System.out.println("儿子的静态年初始化块");

}

{

System.out.println("儿子的普通初始化块");

}

public Sun(){

super("哥想你了");

System.out.println("哥真的想你啦");

}

}

public class staticTest {

public static void main(String[] args) {

new Sun();

new Sun();

}

}

执行结果是:

老爸的初始化块

我的静态初始化块

儿子的静态年初始化块

老爸的普通初始化块

老爸的无参构造方法

我的普通初始化块

我的无参数构造方法

我的带参数构造方法,参数是哥想你了

儿子的普通初始化块

哥真的想你啦

老爸的普通初始化块

老爸的无参构造方法

我的普通初始化块

我的无参数构造方法

我的带参数构造方法,参数是哥想你了

儿子的普通初始化块

哥真的想你啦

第一次创建一个Sun对象时,因为系统中还不存在Sun类,因此需要先加载并初始化,初始化Sun类时先执行顶层父类的静态初始化块,然后执行其直接父类的静态初始化块,最后才只i系那个Sun本身的静态初始化块,一旦Sun类初始化成功,Sun类在该虚拟机里将会一直存在,因此当第二次创建Sun实例时无需再次对Leaf类进行初始化


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics