我们知道一个类(class)要被使用必须经过装载,连接初始化这样的过程。下面先对这三阶段做一个简单的描述,之后会结合一个简单的例子来说明java中类的初始化过程。

在装载阶段,类装载器(Bootstrap ClassLoader 或者用户自定义的ClassLoader) 把编译形成的class文件载入内存,创建类相关的Class对象,这个Class对象封装了我们要使用的类的类型信息。

连接阶段又可以分为三个子步骤:验证、准备和解析。

验证就是要确保java类型数据格式 的正确性,并适于JVM使用。

准备阶段,JVM为静态变量分配内存空间,并设置默认值,注意,这里是设置默认值,比如说int型的变量会被赋予默认值0 。在这个阶段,JVM可能还会为一些数据结构分配内存,目的 是提高运行程序的性能,比如说方法表。

解析过程就是在类型的常量池中寻找类、接口、字段和方法的符号引用,把这些符号引用替换成直接引用。这个阶段可以被推迟到初始化之后,当程序运行的过程中真正使用某个符号引用的时候 再去解析它。

类会在首次被“主动使用”时执行初始化,为类(静态)变量赋予正确的初始值。在Java代码中,一个正确的初始值是通过类变量初始化语句或者静态初始化块给出的。而我们这里所说的主动使用 包括:

1. 创建类的实例

2. 调用类的静态方法

3. 使用类的非常量静态字段

4. 调用Java API中的某些反射方法

5. 初始化某个类的子类

6. 含有main()方法的类启动时

初始化一个类包括两个步骤:

1、 如果类存在直接父类的话,且直接父类还没有被初始化,则先初始化其直接父类

2、 如果类存在一个初始化方法,就执行此方法

注:初始化接口并不需要初始化它的父接口。

Java中final变量为什么在使用前必须要进行初始化:

final修饰的变量表示赋值之后不能再进行更改,系统赋默认值也算赋值,因此系统也不会赋默认值。

如果不在定义的时候或者构造函数中对final变量进行赋值的话,则生成的对象中final变量的值是未知的(编译器也会直接报错),因此必须进行初始化。

如果用static final同时修饰变量的话,则变量必须在定义的时候进行初始化。因为static变量属于类,在调用构造函数之前就已经被系统赋予默认值了。

如果不在定义的时候初始化,那么既无法在构造函数中初始化,系统也不会赋默认值。则该变量被定义出来是毫无意义的

原文:https://www.cnblogs.com/rookieZC/p/11430403.html

java 对象初始化属性,JAVA中类属性的初始化相关推荐

  1. java实例化类之后如何赋值_深入理解Java对象的创建过程:类的初始化与实例化...

    摘要: 在Java中,一个对象在可以被使用之前必须要被正确地初始化,这一点是Java规范规定的.在实例化一个对象时,JVM首先会检查相关类型是否已经加载并初始化,如果没有,则JVM立即进行加载并调用类 ...

  2. 深入理解Java对象的创建过程:类的初始化与实例化

    摘要: 在Java中,一个对象在可以被使用之前必须要被正确地初始化,这一点是Java规范规定的.在实例化一个对象时,JVM首先会检查相关类型是否已经加载并初始化,如果没有,则JVM立即进行加载并调用类 ...

  3. java 对象构造函数_20.Java基础_对象的构造函数

    package pack1; public class Student { private String name; private int age; //构造方法 //如果没有任何构造函数,系统会自 ...

  4. ajax java对象返回前台少了属性_AJAX常见提交数据的三种方式

    一.键值对方式提交 AJAX提交 控制器接收 方式1:属性接收 @RequestMapping("stu/add") @ResponseBody public HashMap ad ...

  5. 移除Java对象中的属性_在java对象中添加和删除属性

    我怎样才能在 java中实现这一点.我有一个具有属性的对象. public class Object { private final Credentials Credentials; private ...

  6. Java对象的创建过程:类的初始化与实例化

    一.Java对象创建时机 我们知道,一个对象在可以被使用之前必须要被正确地实例化.在Java代码中,有很多行为可以引起对象的创建,最为直观的一种就是使用new关键字来调用一个类的构造函数显式地创建对象 ...

  7. java 对象怎么序列化,java对象序列化总结

    java对象序列化小结 百度百科上介绍序列化是这样的: 序列化 (Serialization): 将对象的状态信息转换为可以存储或传输的形式的过程.在序列化期间,对象将其当前状态写入到临时或持久性存储 ...

  8. java 对象转json,java首字母小写,判断方法是否为javabean方法

    将java对象转成json可用的类库很多,知名的有fastjson,jackson等,今天在做项目的时候发现项目没有上述依赖,用的是google的gson,因此封装方法将java对象转成gson代表的 ...

  9. json转java对象_json转java对象

    1.DTO:Data Transfer Object,数据传送对象 2.对于日期格式的问题,也已经处理 3.json-lib-2.2.2-jdk13.jar (2.1在日期数组 json->ja ...

  10. Spring: 读取 .properties 文件地址,json转java对象,el使用java类方法相关 (十三)

    1. 在Java中获取 .properties 文件的路径 (src/main/resources 下) ProjectName |---src/main/java |---src/main/reso ...

最新文章

  1. Deep Belief Network简介——本质上是在做逐层无监督学习,每次学习一层网络结构再逐步加深网络...
  2. java Annotation 简单理解
  3. Django H2 文档查看
  4. 08、求x的y的幂次方的最后3位数——循环
  5. 异步和同步区别是什么_一次相亲经历,我彻底搞懂了什么叫阻塞非阻塞,同步异步...
  6. unity shader 变种(多重编译 multi_compile)
  7. 嘘,这是手淘双11 GMV 暴涨的秘密
  8. 第2章线性表的基本使用及其cpp示例(第二章汇总,线性表都在这里)
  9. java switch 类型_Java switch case数据类型原理解析
  10. DataGrid的ViewState
  11. 自己的 「QA票 CheckList 」 KPT
  12. win10下怎么运行java,如何在Windows 10中运行Java程序
  13. android安装svn,Android StudioSVN安装和使用
  14. Hebb和Delta学习规则
  15. 程序员值得提升的沟通小技巧!
  16. 基于MAX2671设计的400Mhz混频器
  17. Unity 动态改变Text字体颜色
  18. ioredis pipeline用法
  19. android运行报错:File-based resource names must contain only lowercase a-z, 0-9
  20. 域名怎么解析到服务器上

热门文章

  1. 3.4 多个例子中的向量化-深度学习-Stanford吴恩达教授
  2. 0.0 Introduction-机器学习笔记-斯坦福吴恩达教授
  3. 【频谱分配】基于频谱空洞预留算法的频谱分配算法的matlab仿真
  4. Android-MeasureSpec那些事
  5. Java集合框架源码解析之ArrayList
  6. Spring Boot 中使用 RabbitMQ
  7. 一款超级简单的瀑布流的制作
  8. cleanmymac定时清理与垃圾监测
  9. 理解HTTP session原理及应用
  10. 如何用 Parse 和 Swift 搭建一个像 Instagram 那样的应用?(3)