下文讲述Java代码的初始化过程,如下所示:
普通代码块和静态块的运行顺序示例分享
今天面试时,被问到:“Java对象如何初始化呢?”
脑袋里面立刻浮现出"构造器"初始化,
面试官:“立马回应到”,没错,构造器是Java对象中常见的初始化方法,
那是否还有其它的初始化方法呢?
答案是
--------------------------------------------------
静态代码块
采用静态代码块的方式
例:
[修饰符]{
//初始化块的可执行代码
...
}
--------------------------------------------------
注意事项:
此处的修饰符只能为static
例:
public class User {
//定义一个初始化块
{
System.out.println("初始化块-1");
}
//定义第二个初始化块
{
System.out.println("初始化块-2");
}
//定义无参的构造器
public User() {
System.out.println("无参构造器");
}
public static void main(String[] args) {
new User();
}
}
---------运行以上代码,将输出以下信息------
初始化块-1
初始化块-2
无参构造器
/*
从以上的代码运行上,我们可以得到结论:
当我们new一个User对象时,
程序会先运行静态代码块,然后再运行无参构造器
*/
----------------------------------------------------
初始化块和构造方法区别
- 构造器可接收参数,而静态代码块不能接收任何参数
- 代码块通常用于初始化操作,如:静态代码块对类进行初始化,普通代码块负责对对象进行初始化
普通代码块和静态块的运行顺序示例分享
class GongJu{
static {
System.out.println("GongJu的静态初始化块");
}
{
System.out.println("GongJu的普通初始化块");
}
public GongJu(){
System.out.println("GongJu的无参构造器");
}
}
class Che extends GongJu{
static {
System.out.println("Che的静态初始化块");
}
{
System.out.println("Che的普通初始化块");
}
public Che(){
System.out.println("Che的无参构造器");
}
public Che(String name){
this();//调用同类中的重载构造器
System.out.println("Che的带参构造器,name="+name);
}
}
class QiChe extends Che{
static {
System.out.println("QiChe的静态初始化块");
}
{
System.out.println("QiChe的普通初始化块");
}
public QiChe(){
//调用父类中带参数的构造器
super("Java典籍");
System.out.println("QiChe的无参构造器");
}
}
public class Test {
public static void main(String[] args) {
new QiChe();
System.out.println("=========");
new QiChe();
}
}
-------运行以上代码,将输出以下信息--------------
GongJu的静态初始化块
Che的静态初始化块
QiChe的静态初始化块
GongJu的普通初始化块
GongJu的无参构造器
Che的普通初始化块
Che的无参构造器
Che的带参构造器,name=Java典籍
QiChe的普通初始化块
QiChe的无参构造器
=========
GongJu的普通初始化块
GongJu的无参构造器
Che的普通初始化块
Che的无参构造器
Che的带参构造器,name=Java典籍
QiChe的普通初始化块
QiChe的无参构造器
第一次创建QiChe对象时, 此时系统还未有QiChe对象, 因此需要先加载并初始化QiChe类, 初始化QiChe类会先执行其顶层父类的静态初始化块, 再执行其直接父类的静态初始化块, 最后才执行其本身的静态初始化块。 一旦QiChe类初始化成功后,其在虚拟机中一直存在, 当第二次再创建QiChe对象时 无需再对QiChe类进行初始化。
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。


