Java为对象初始化提供了多种选项。

当new一个对象的时候,对象初始化开始:

1.首先,JVM加载类(只加载一次,所以,即使多次new对象,下面的代码也只会在第一次new的时候执行一次),此时,

  • 静态字段默认初始化

    声明为static的静态字段会被初始化为默认值:数字为0,布尔值为false,对象为null

  • 静态字段显式初始化

    如果statis字段有显式赋值,就执行显式初始化

  • 静态代码块

    静态代码块可以有任意多个,它们的执行顺序就是在类中声明的顺序

2.类加载完毕,然后以下代码(每次new对象都会执行),

  • 默认字段初始化

    成员变量首先会自动地的被初始化为默认值:数字为0,布尔值为false,对象为null。

    局部变量不会被自动初始化,使用前必须先进性赋值。

  • 显式字段初始化

  • 初始化块

    初始化块可以有任意多个,其执行顺序就是它们在类中声明的顺序

3.构造器初始化

  • 如果在构造器中使用this调用了另一个构造器,就执行被调用的构造器

  • 然后,执行构造器中的代码

4.如果一个类继承了另一个类(当然,任意类都直接或间接的继承自Object),在构造器初始化时,有所不同

  • 如果派生类中的构造器使用super调用了超类中的构造器,

    首先会先加载超类(只会加载一次),执行静态字段初始化与静态初始化块;

    然后,执行超类中的字段初始化与初始化块;

    接着,执行被调用的超类构造器中的代码;

    最后,执行当前类构造器中的代码。

  • 如果没有使用super调用超类中的构造器,JVM会调用超类中的默认(无参)构造器,其执行顺序同上。

    所以,如果超类中没有无参构造器(定义了有参构造器),并且子类构造器中没有使用super调用超类中的有参构造器,编译器会报错。

演示代码

public class MyClass {
private int i=0;
private String s=null;
private static int id=0; static {
System.out.println("静态初始化块 1");
} static {
System.out.println("静态初始化块 2");
} {
System.out.println("初始化块 1");
} {
System.out.println("初始化块 2");
} public MyClass() {
this(0,"");
System.out.println("MyClass()");
} public MyClass(int i, String s) {
System.out.println("MyClass(int,String)");
this.i = i;
this.s = s;
} public static void main(String[] args) {
new MyClass();
}
}
public class MySubClass extends MyClass
{
private int b=0; public MySubClass()
{
System.out.println("MySubClass()");
} public MySubClass(int i,String s,int b)
{
super(i,s);
this.b = b;
System.out.println("MySubClass(int,String,int)");
} public static void main(String[] args)
{
new MySubClass();
new MySubClass(0,"",0);
}
}

Java中对象初始化过程的更多相关文章

  1. Java中对象创建过程

    本文介绍的对象创建过程仅限于普通Java对象,不包括数组和Class对象. 1.类加载检查 虚拟机遇到一条new指令时,首先去检查该指令的参数能否在常量池中定位到一个类的符号引用,并且检查这个符号引用 ...

  2. Java的对象初始化过程

    成员变量(字段)初始化顺序 在一个类里初始化的顺序是由成员变量在类里面的定义的顺序来决定的.即使成员变量大量散布于类的各个方法定义的中间,那些成员变量仍会在调用任何方法之前得以初始化,甚至在构造函数调 ...

  3. 【软件构造】-<笔记>-浅谈java中类的初始化过程

    编写java程序时,每创建一个新的对象,都会对对象的内容进行初始化. 每一个类的方法中的局部变量都有严格的初始化要求,因此假如写出下面的程序: void f(){ int i; i++; } 编译时就 ...

  4. Java父类子类的对象初始化过程

    摘要 Java基本的对象初始化过程,子类的初始化,以及涉及到父类和子类的转化时可能引起混乱的情况. 1. 基本初始化过程: 对于一个简单类的初始化过程是: static 修饰的模块(static变量和 ...

  5. Java中对象方法的调用过程&动态绑定(Dynamic Binding)

    Java面向对象的最重要的一个特点就是多态, 而多态当中涉及到了一个重要的机制是动态绑定(Dynamic binding). 之前只有一个大概的概念, 没有深入去了解动态绑定的机理, 直到很多公司都问 ...

  6. java中对象的初始化问题

    最近又把java编程思想看了看.又有些收获.此书确实不错 java中的初始化相信很多人都知道.但是具体的初始化步骤,初始化几次确不一定.上代码 public class A{ public stati ...

  7. java代码的初始化过程研究

        刚刚在ITeye上看到一篇关于java代码初始化的文章,看到代码我试着推理了下结果,虽然是大学时代学的知识了,没想到还能做对.(看来自己大学时掌握的基础还算不错,(*^__^*) 嘻嘻……)但 ...

  8. 转:java实例化对象的过程

    学习JAVA这门面向对象的语言,实质就是不断地创建类,并把类实例化为对象并调用方法.对于初学JAVA的人总搞清楚对象是如何实例化的,假如类之间存在继承关系,那就更糊涂了.下面我们通过两个例题来说明对象 ...

  9. Java中的初始化详细解析

    今天所要详细讲解的是Java中的初始化,也就是new对象的过程中,其程序的行走流程. 先说没有静态成员变量和静态代码块的情况. public class NormalInit { public sta ...

随机推荐

  1. IP包头部格式解析

    IPv4首部一般是20字节长.在以太网帧中,IPv4包首部紧跟着以太网帧首部,同时以太网帧首部中的协议类型值设置为080016. IPv4提供不同,大部分是很少用的选项,使得IPv4包首部最长可扩展到 ...

  2. [知识路书]beta设计和计划

    [知识路书]beta设计和计划 一.需求再分析 根据用户反馈,是否发现之前的需求分析有偏差?为什么会出现这种偏差?beta阶段你们是否能真的分析清楚用户需求?如何做到? 根据alpha阶段的推广情况以 ...

  3. 在 Linux 中,最直观、最可见的部分就是 文件系统(file system)

    在 Linux 中,最直观.最可见的部分就是 文件系统(file system).下面我们就来一起探讨一下关于 Linux 中国的文件系统,系统调用以及文件系统实现背后的原理和思想.这些思想中有一些来 ...

  4. spec cpu2006 官网

    https://www.spec.org/cpu2006/Docs/install-guide-unix.html

  5. 2.9. 管道和重定向ls /proc && echo suss! || echo failed. 能够提示命名是否执行成功or失败; 与上述相同效果的是: if ls /proc; then echo suss; else echo fail; fi

    2.9. 管道和重定向 批处理命令连接执行,使用 | 串联: 使用分号 ; 前面成功,则执行后面一条,否则,不执行:&& 前面失败,则后一条执行: || ls /proc && ...

  6. Linux软件安装管理之——dpkg与apt-*详解 apt命令(dpkg和apt代替rpm)

    apt list *python* Nosee123关注赞赏支持   Linux软件安装管理之--dpkg与apt-*详解 [Linux软件安装管理系列]- - 传送门: - -<Linux软件 ...

  7. MySQL 查询操作

    目录 基本语法 查询常量 查看表达式 查询函数 查询指定字段 查询所有列 列别名 表别名 条件查询 条件查询运算符 逻辑查询运算符 排序与分页 排序查询(order by) 排序方式 limit 分组 ...

  8. 040.Python进程和Join

    一  进程相关介绍 1.1 进程的概念(process) 进程就是正在运行的程序,它是操作系统中,资源分配的最小单位 资源分配:分配的是cpu和内存等物理资源 进程号是程的唯标识 同-个程序执行两次之 ...

  9. 【Microstation】三维建模基础及软件入门到精通实验教程目录

    @ 目录 1. 专栏简介 2. 专栏地址 3. 专栏目录 1. 专栏简介 MicroStation是一款非常不错的二维和三维设计软件,由奔特力(Bentley)工程软件系统有限公司开发的一款软件.在C ...

  10. macOS Big Sur 11.4 (20F71) 正式版(DMG、ISO、IPSW),百度网盘下载

    本站提供的 macOS Big Sur 软件包,既可以拖拽到 Applications(应用程序)下直接安装,也可以制作启动 U 盘安装,或者在虚拟机中启动安装. 请访问原文链接:https://sy ...