java实例化

Wesley13
• 阅读 825

初始化块

  • 实际上,初始化块是一个假象,使用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的无参构造器
Mid的带参构造器,其参数值:疯狂java
Leaf的普通初始化块
Leaf的无参构造器
Root的普通初始化块
Root的无参构造器
Mid的普通初始化块
Mid的无参构造器
Mid的带参构造器,其参数值:疯狂java
Leaf的普通初始化块
Leaf的无参构造器

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

  Mid的静态初始化块 -->

  Leaf的静态初始化块 -->

  回到Test类new Leaf() -->

  进入Leaf无参构造 -->

super进入Mid有参构造 -->

this进入MId无参构造 -->

super进入Root无参构造 -->

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

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

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

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

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

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

更多见:www.zhanzhimin.cn

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Wesley13 Wesley13
3年前
java常用类(2)
三、时间处理相关类Date类:计算机世界把1970年1月1号定为基准时间,每个度量单位是毫秒(1秒的千分之一),用long类型的变量表示时间。Date分配Date对象并初始化对象,以表示自从标准基准时间(称为“历元”(epoch),即1970年1月1日08:00:00GMT)以来的指定毫秒数。示例:packagecn.tanjian
Wesley13 Wesley13
3年前
java成员变量的初始化
类变量(static变量,不需要实例化对象也可以引用)实例变量(非static变量,需要实例化对象)局部变量(类的成员函数中的变量)初始化方式:构造函数初始化变量声明时初始化代码块初始化java自动初始化(在构造函数执行之前执行) java保证所有变量被使用之前都是经过初始化的(声明并且定义过,被赋值
Wesley13 Wesley13
3年前
java中静态初始化块的执行顺序
在java中,其应该是先于所有的方法执行。下面是测试代码:1publicclassTest1{2static{3System.out.println("执行静态初始化块test1...");4}5{6System.out.println(
Wesley13 Wesley13
3年前
mysql索引BTree和B+Tree分析
BTree索引!(https://oscimg.oschina.net/oscnet/3329cf028540693bf2307cdc60e8fccc776.jpg)  【初始化介绍】 一颗b树,浅蓝色的块我们称之为一个磁盘块,可以看到每个磁盘块包含几个数据项(深蓝色所示)和指针(黄色所示),如磁盘块1包含数据项17和35
Easter79 Easter79
3年前
Tomcat8源码分析3
1\.执行Bootstrap类的static代码块,初始化Bootstrap的catalinaHomeFile属性和catalinaBaseFile属性,默认情况下值都为tomcat的安装目录.关于这两个属性,说明如下.Adva
Wesley13 Wesley13
3年前
Java面向对象之构造器
\toc\Java面向对象之构造器利用构造器确保初始化初始化问题是关系编程方式是否安全的一个重要的问题。功能:在创建对象时执行初始化。在Java中,每个类至少有一个构造器。格式如下:修饰符构造器名(参数列表){...执行体
Wesley13 Wesley13
3年前
Java构造器的实质作用
Java构造器的实质作用构造器的本质作用就是为对象初始化,即为实例变量初始化,赋初值;而不是创建对象,创建对象时通过new关键字来完成的,当使用new关键字时就会为该对象在堆内存中开辟一块内存,只等构造器来初始化这块内存,为实例变量赋初始值。在未赋初始值之前是默认值。看代码中的构造器和编译后构造器是不一样的,编译后的构造器包含了更多的内容。
Wesley13 Wesley13
3年前
Java类的初始化顺序 (静态变量、静态初始化块、变量、初始...
大家在去参加面试的时候,经常会遇到这样的考题:给你两个类的代码,它们之间是继承的关系,每个类里只有构造器方法和一些变量,构造器里可能还有一段代码对变量值进行了某种运算,另外还有一些将变量值输出到控制台的代码,然后让我们判断输出的结果。这实际上是在考查我们对于继承情况下类的初始化顺序的了解。我们大家都知道,对于静态变量、静态初始化块、变量、初始化块