类的初始化包括静态属性的初始化和实例属性的初始化,在加载类过程中的准备阶段会给静态属性分配存储空间,并根据属性的类型设置初始值,例如 int 类型静态属性会设置初始值为 0,布尔类型静态属性会设置初始值为 false;实例属性的初始化会在构造实例对象时发生。

这里提到的静态属性不包括静态常量,静态常量会在准备阶段直接赋予指定的初始值。

构造实例对象

输出结果为:

由此可知,静态属性的初始化发生在实例属性的初始化之前,且只发生一次,实例属性在每次创建实例对象会进行初始化。

在加载阶段之后,会在内存中保存一个类的java.lang.Class对象,通过该Class对象来访问类中的各项数据,包括静态属性。所以静态属性只需要初始化赋值一次,生成Class对象后,通过Class对象来访问静态属性,实例属性则会在每次生成实例对象时初始化一次。

加载、验证、准备阶段的顺序只是开始顺序,在某一个时间点,可能同时执行多个阶段的任务。例如加载阶段会将二进制字节流转换为内存中的一个Class对象,获取二进制信息后,会启动验证阶段对字节流进行安全验证,验证通过,准备阶段进行静态属性的内存分配和默认值设置,最后才会生成一个Class对象。

构造子类实例对象

输出结果为:

由此可知,在进行子类静态属性初始化时,若父类还没有进行静态初始化,则会先进行父类的静态初始化;在子类实例属性初始化时,若父类还没有进行实例属性初始化,则会先进行父类的实例属性初始化。并且每次构造实例对象都会进行实例属性初始化。

静态属性的定义和使用

输出结果为:

上面提到在准备阶段会对静态属性设置类型默认值,由此可知,示例代码中的静态变量 i,在准备阶段默认值为 0。在初始化阶段,静态代码块和静态变量定义相当于两次赋值,首先设置 i=1,然后 i=2,所以输出值为 2。

通过该示例可知,静态代码块和静态变量定义的赋值操作区分前后顺序,这里有一点需要注意:静态代码中只能访问定义在静态代码块之前的变量,即不能访问未初始化的变量。例如如下情况会编译报错:

本文同步分享在 博客“zhipingChen”(JianShu)。

如有侵权,请联系 support@oschina.cn 删除。

本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

java实例属性_Java 静态属性与实例属性的初始化相关推荐

  1. java线程安全问题之静态变量、实例变量、局部变量

    转载 java多线程编程中,存在很多线程安全问题,至于什么是线程安全呢,给出一个通俗易懂的概念还是蛮难的,如同<java并发编程实践>中所说: 写道 给线程安全下定义比较困难.存在很多种定 ...

  2. java 线程安全问题之静态变量、实例变量、局部变量

    2019独角兽企业重金招聘Python工程师标准>>> java多线程编程中,存在很多线程安全问题,至于什么是线程安全呢,给出一个通俗易懂的概念还是蛮难的,如同<java并发编 ...

  3. 常见Java面试题之静态变量和实例变量的区别

    静态变量和实例变量的区别有哪些? 静态变量和实例变量可能大多数同学用的比较多,但是相关阐述并不是很常见,尤其对新手同学可以不能清楚表达. 静态变量和实例变量也是最经常遇到的一个基础java面试题,不管 ...

  4. java 类变量 赋值_Java 中类变量,实例变量,局部变量的赋值

    在 Java 中,类变量,实例变量可以不经过主动赋值就直接使用,而局部变量在不主动赋值的情况下,是无法使用的.在下面分析一下这个原因: 1. 类变量 类变量的赋值有两次,两次都在类加载的过程中,类加载 ...

  5. java 模拟停车_Java多线程编程小实例模拟停车场系统

    下面分享的是一个Java多线程模拟停车场系统的小实例(Java的应用还是很广泛的,哈哈),具体代码如下: Park类 public class Park { boolean []park=new bo ...

  6. java自由块_JAVA 静态的自由块和非静态的自由块

    java中的自由块分为静态的自由块和非静态的自由块,这两种的执行是有区别的. 非静态自由块的执行时间是:在执行构造函数之前. 静态自由块的执行时间是:class文件加载时执行. 执行的时间不同,造成的 ...

  7. java修饰方法_java接口中方法、属性修饰符详解

    java接口的修饰符:abstract(inteeface本身就是抽象的,加不加abstract都一样). 接口中字段的修饰符:public static final(默认不写) 如下解释: publ ...

  8. java面向对象例子_Java面向对象及方法实例讲解

    第一节方法 1.1定义 定义:封装了能够完成特定功能的代码块,是程序编程中的一种功能实现单元: 1.2语法 修饰符  返回值类型   方法名(参数列表) { 方法体: } 例子: 1 public s ...

  9. java 数据库 空值_java – 是否可以将枚举属性的空值存储到数据库?

    我试图使用JPA TopLink将 Java中实体的枚举属性的null值存储到Oracle数据库.代码执行时没有异常或警告,但实体未存储在数据库中. 该实体定义如下: @Entity public c ...

最新文章

  1. 韩宇:如何准备天池深度学习比赛?
  2. Java awt Desktop 无法调用系统浏览器
  3. Java的i =i_java中i = i++和i =++i的深入讲解
  4. BGP:全穿透,半穿透,静态代播有什么区别
  5. ASP.NET 开源导入导出库Magicodes.IE 导出Pdf教程
  6. Qt文档阅读笔记-最简单的动态3D圆环实例
  7. awk命令详解_python学习之利用urllib和urllib2访问http的GET/POST详解
  8. ImageAI (四) 使用Python快速简单实现自定义预测模型的训练 Custom Model Training
  9. w ndows无法完成格式化,windows无法完成格式化怎么办【图文教程】
  10. 伏羲六十四卦+36D
  11. 次世代zbrush骷颅头高模雕刻 艺术头骨SP模型材质贴图讲解
  12. HTTP性能极限优化
  13. securecrt能输入命令吗?
  14. asp mysql 性能_asp优化:最大限度优化你的Asp性能
  15. 注意!这些行业已经在使用智能语音机器人做销售啦!
  16. 纵横内外·突破盲区|BF-TR8500​高功率全频段数字中继台
  17. 判断Android Textview是否换行
  18. 代码全解:Python实现自动玩贪吃蛇程序
  19. 半导体器件物理【15】非平衡过剩载流子 —— 连续性方程
  20. python绘制饼状图图例_Python图表绘制很简单,一文带你学会如何生成带图例的饼图...

热门文章

  1. 蓝桥杯 ALGO-54 算法训练 简单加法(基本型)
  2. [Java] 蓝桥杯BASIC-13 基础练习 数列排序
  3. 蓝桥杯 BASIC-15 基础练习 字符串对比
  4. 【iOS】Swift3中NSFetchRequest报错:Generic parameter 'ResultType' could not be inferred
  5. LeetCode 67. Add Binary
  6. excel中如何添加下拉选择框
  7. linux下安装tuxedo
  8. 读《程序员修炼之道——从小工到专家》
  9. 《快乐编程大本营》java语言训练班 1课:第一个java程序:你好,范冰冰;
  10. RHEL7.0手动安装