Java中对象初始化过程
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中对象初始化过程的更多相关文章
- Java中对象创建过程
本文介绍的对象创建过程仅限于普通Java对象,不包括数组和Class对象. 1.类加载检查 虚拟机遇到一条new指令时,首先去检查该指令的参数能否在常量池中定位到一个类的符号引用,并且检查这个符号引用 ...
- Java的对象初始化过程
成员变量(字段)初始化顺序 在一个类里初始化的顺序是由成员变量在类里面的定义的顺序来决定的.即使成员变量大量散布于类的各个方法定义的中间,那些成员变量仍会在调用任何方法之前得以初始化,甚至在构造函数调 ...
- 【软件构造】-<笔记>-浅谈java中类的初始化过程
编写java程序时,每创建一个新的对象,都会对对象的内容进行初始化. 每一个类的方法中的局部变量都有严格的初始化要求,因此假如写出下面的程序: void f(){ int i; i++; } 编译时就 ...
- Java父类子类的对象初始化过程
摘要 Java基本的对象初始化过程,子类的初始化,以及涉及到父类和子类的转化时可能引起混乱的情况. 1. 基本初始化过程: 对于一个简单类的初始化过程是: static 修饰的模块(static变量和 ...
- Java中对象方法的调用过程&动态绑定(Dynamic Binding)
Java面向对象的最重要的一个特点就是多态, 而多态当中涉及到了一个重要的机制是动态绑定(Dynamic binding). 之前只有一个大概的概念, 没有深入去了解动态绑定的机理, 直到很多公司都问 ...
- java中对象的初始化问题
最近又把java编程思想看了看.又有些收获.此书确实不错 java中的初始化相信很多人都知道.但是具体的初始化步骤,初始化几次确不一定.上代码 public class A{ public stati ...
- java代码的初始化过程研究
刚刚在ITeye上看到一篇关于java代码初始化的文章,看到代码我试着推理了下结果,虽然是大学时代学的知识了,没想到还能做对.(看来自己大学时掌握的基础还算不错,(*^__^*) 嘻嘻……)但 ...
- 转:java实例化对象的过程
学习JAVA这门面向对象的语言,实质就是不断地创建类,并把类实例化为对象并调用方法.对于初学JAVA的人总搞清楚对象是如何实例化的,假如类之间存在继承关系,那就更糊涂了.下面我们通过两个例题来说明对象 ...
- Java中的初始化详细解析
今天所要详细讲解的是Java中的初始化,也就是new对象的过程中,其程序的行走流程. 先说没有静态成员变量和静态代码块的情况. public class NormalInit { public sta ...
随机推荐
- 【开源技术分享】无需流媒体服务,让浏览器直接播放rtsp/rtmp的神器:EasyMedia
不同于市面上其他需要各种转发到流媒体服务的中间件来说,EasyMedia不需要依赖任何nginx-rtmp,srs,zlmediakit等等第三方流媒体服务,只需要你有rtsp或者rtmp等等协议的视 ...
- HEVC学习(一) —— HM的使用
http://blog.csdn.net/hevc_cjl/article/details/8169182 首先自然是先把这个测试模型下载下来,链接地址如下:https://hevc.hhi.frau ...
- CRM系统全方位管理企业
您在选择一款CRM系统的时候,首先要考虑销售团队的感受和意见.让CRM系统在帮助销售团队优化工作流程的同时,更好地对销售团队进行管理.销售人员每卖出一件商品,要从寻找筛选商机开始,经过沟通客户需求.满 ...
- [刷题] 455 Assign Cookies
要求 贪心算法的关键:判断问题是否可以用贪心算法解决 给小朋友们分饼干,每个小朋友"贪心指数"为g(i),饼干大小值s(i) g(i):小朋友需要的饼干大小的最小值 若s(j)&g ...
- too many open files问题详解
too many open files问题详解 feelgood3000关注0人评论2616人阅读2018-08-23 09:47:52 一 单个进程打开文件句柄数过多 ulimit中的nofi ...
- 【大咖直播】Elastic 可观测性实战工作坊
Elastic 的可观测性解决方案是基于 Elastic Stack 的一站式解决方案.该解决方案具有完备的日志.指标.APM 和可用性采集能力,可以在大规模和云原生的环境下完成基于服务质量目标的管理 ...
- 浅谈:@RequestBody,@ResponseBody 和 @RequestParam
1. @RequestBody @RequestBody:主要用来接收前端传递给后端的json字符串中的数据的(请求体中的数据) GET方式无请求体,所以使用@RequestBody接收数据时,前端不 ...
- Java安全之Cas反序列化漏洞分析
Java安全之Cas反序列化漏洞分析 0x00 前言 某次项目中遇到Cas,以前没接触过,借此机会学习一波. 0x01 Cas 简介 CAS 是 Yale 大学发起的一个开源项目,旨在为 Web 应用 ...
- 『动善时』JMeter基础 — 27、通过JMeter函数助手实现参数化
目录 1.测试计划中的元件 2.数据文件内容 3.函数助手配置 (1)函数助手的打开方式 (2)函数助手界面介绍 (3)编辑后的函数助手界面 4.HTTP请求组件内容 5.线程组元件内容 6.脚本运行 ...
- Navigation DialogFragment展示dialog
如果按照一般fragment的写法: 在nav_config中 <fragment android:id="@+id/fragment_crime_detail" andro ...