初始化块与构造方法的作用很相似,他们都用于对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类进行初始化
分享到:
相关推荐
NULL 博文链接:https://yuu1987.iteye.com/blog/1113142
Java初始化块Java初始化块
NULL 博文链接:https://happywaterlife.iteye.com/blog/1567461
文章目录【Java语言基础】初始化块使用初始化块静态初始化块总结代码 【Java语言基础】初始化块 初始化块又称为代码块。属于类中的第四大成员。本质上是一个方法,它也有方法体,但没有方法名,没有参数,没有返回,...
Java中的静态块初始化块及main方法
详细介绍了Java的静态成员变量、静态数据块、非静态成员变量和非静态成员变量等初始化顺序
我们大家都知道,对于静态变量、静态初始化块、变量、初始化块、构造器,它们的初始化顺序依次是(静态变量、静态初始化块)>(变量、初始化块)>构造器。我们也可以通过下面的测试代码来验证这一点:
主要介绍了Java中初始化块详解及实例代码的相关资料,在Java中,有两种初始化块:静态初始化块和非静态初始化块,需要的朋友可以参考下
System.out.println("父类--静态初始化块"); } // 初始化块 { System.out.println(p_Field); System.out.println("父类--初始化块"); } // 构造器 public Parent() { System.out.println(...
TIA博途学习 | 优化的DB块中添加变量时不想初始化DB块怎么做?
TIA博途中如何设置不需要初始化DB块也可以进行下载?
主要介绍了Java初始化块及执行过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
ECMAScript类静态初始化块 类static块提供了一种在类定义评估期间执行其他静态初始化的机制。 这不打算替代公共字段,因为它们为静态分析工具提供了有用的信息,并且是装饰器的有效目标。 相反,这旨在扩大现有用例...
在本篇文章里我们针对Java中的实例初始化块(IIB)做想详细分析,有需要的朋友们可以跟着学习参考下。
主要介绍了简单了解java中静态初始化块的执行顺序,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
数据块下载不初始化.docx
•用static修饰的初始化块为静态初始化块,由于是静态的,所以是属于类,当类加载时,就执行静态初始化块 , 但执行一个子类时,最先执行其最顶层父类的静态初始化, •初始化块是属于实例 的。只要创建一次...
SD的初始化、块扇区的读写、以及SD卡文件结构的掌握
我们大家都知道,对于静态变量、静态初始化块、变量、初始化块、构造器,它们的初始化顺序依次是(静态变量、静态初始化块)>(变量、初始化块)>构造器。我们也可以通过下面的测试代码来验证这一点: