java实例化

Posted haiyuexiaozu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java实例化相关的知识,希望对你有一定的参考价值。

初始化块

  • 实际上,初始化块是一个假象,使用javac命令编译java类后,初始化块会消失,初始化代码被还原到每个构造器中代码的最前面
  • 在实例化的过程中:前面的初始化块先执行,后面的后执行
  • 初始化块的修饰符只能是 static
  • 普通初始化块负责对对象执行初始化,静态初始化块负责对类执行初始化
  • 初始化块只在创建java对象时隐式的执行,在构造器之前执行

当创建java对象时,初始化顺序是

1、第一次类加载时:

  • 先执行顶层父类的静态初始化代码,再向下追溯执行间接父类静态初始化代码,
    最后执行直接父类静态初始化代码;

  • 静态初始化块和声明静态成员变量时指定的初始值都是给类的静态初始化代码,
    它们的执行顺序与源码中书写顺序相同。

2、接着开始对对象实例化

  • 先执行初始化块或声明实例变量时指定的初始值(两者执行顺序与源码书写顺序相同),
  • 再执行构造器里的代码。

例子:

 1 class Root
 2     static 
 3         System.out.println("Root的静态初始化块");
 4     
 5     
 6     
 7         System.out.println("Root的普通初始化块");
 8     
 9     
10     public Root() 
11         System.out.println("Root的无参构造器");
12     
13     
14 
15 
16 class Mid extends Root
17     static 
18         System.out.println("Mid的静态初始化块");
19     
20     
21     
22         System.out.println("Mid的普通初始化块");
23     
24     
25     public Mid() 
26         System.out.println("Mid的无参构造器");
27     
28     
29     public Mid(String msg) 
30         this();
31         System.out.println("Mid的带参构造器,其参数值:" + msg);
32     
33     
34 
35 
36 class Leaf extends Mid
37     static 
38         System.out.println("Leaf的静态初始化块");
39     
40     
41     
42         System.out.println("Leaf的普通初始化块");
43     
44     
45     public Leaf() 
46         super("疯狂java");
47         System.out.println("Leaf的无参构造器");
48     
49 
50 
51 public class Test 
52     public static void main(String[] args)
53         new Leaf();
54         new Leaf();
55     
56 

执行结果:

Root的静态初始化块
Mid的静态初始化块
Leaf的静态初始化块
Root的普通初始化块
Root的无参构造器
Mid的普通初始化块
Mid的无参构造器
Leaf的普通初始化块
Leaf的无参构造器
Root的普通初始化块
Root的无参构造器
Mid的普通初始化块
Mid的无参构造器
Leaf的普通初始化块
Leaf的无参构造器

程序执行流程:
  Root的静态初始化块 -->

  Mid的静态初始化块 -->

  Leaf的静态初始化块 -->

  回到Test类new Leaf() -->

  进入Leaf无参构造 -->

  super进入Mid有参构造 -->

  this进入MId无参构造 -->

  super进入Root无参构造 -->

  进入Root初始化块执行打印 -->

  进入Super无参构造并执行打印 -->

  进入Mid普通初始化块执行打印 -->

  进入MId无参构造并执行打印 -->

  进入Mid有参构造执行打印 -->
  进入Leaf初始化块打印 -->

  进入Leaf无参构造打印 --> .........

以上是关于java实例化的主要内容,如果未能解决你的问题,请参考以下文章

java 片段实例化器

片段事务中的实例化错误

启用 Proguard 后无法实例化片段

Android - 试图实例化一个不是片段的类

调用片段活动错误无法实例化活动。无法转换为 android.app.Activity

操作栏选项卡:使用多次实例化的单个片段时如何传递参数