初始化块
来源:互联网 发布:软件开发模式包括 编辑:程序博客网 时间:2024/04/28 02:13
初始化块与构造方法的作用很相似,他们都用于对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类进行初始化
- 初始化块
- 初始化块
- 初始化块
- 初始化块
- 初始化块
- 初始化块
- 初始化块
- 初始化块
- 初始化块
- 初始化块
- 初始化块
- 初始化块
- 初始化块
- 初始化块
- 初始化块/静态初始化块
- 静态初始化块、初始化块、构造函数
- 静态初始化块、初始化块、构造函数
- 初始化块 和 静态初始化块
- 如何优化sql语句
- 显示动态动画
- 字符串常量下标引用
- 烧写busybox的方法(烧写到3560e芯片的盒子中)
- 研一的苦恼
- 初始化块
- Eclipse 导出jar文件异常总结
- QT布局
- 单例类
- 直接存储器存取—基本原理、结构与应用(上)
- poj 2051 Argus(优先队列)
- nodeJS入门例子一概要(Synopsis)
- The Annotated STL Sources 读后感
- Fedora 中的 Fedora Yum命令详解