Java类初始化、变量初始化

摘自:https://blog.csdn.net/mocas_wang/article/details/109956014

基础知识

  • Java常量, final 修饰,值被设定后不能再被修改
  • 静态变量里, static 修饰,顾名思义,无须创建对象,便可在内存中申请一个存储空间进行存储
  • 成员变量, 也称实例变量,它随着当前对象的建立而建立,随着对象的销毁而销毁,存在于对象所在的堆内存中
  • 构造器,创建class对象时执行
  • 静态初始化块 ,执行优先级高于非静态的初始化块,它会在对象装载到 jvm的时候执行一次,执行完成便销毁,只能初始化 static 修饰的变量
  • 非静态初始化块,执行的时候如果有静态初始化块,先执行静态初始化块再执行非静态初始化块,在每个对象生成时都会被执行一次,它可以初始化类的实例变量。但它会在构造函数执行之前被执行。

类的初始化顺序

Java中类初始化顺序,依次是(静态变量、静态初始化块)>(变量、初始化块)>构造器。。

变量的初始化问题

类成员变量初始化

对于类的成员变量。不管程序有没有显示的初始化,Java 虚拟机都会先自动给它初始化为默认值。

规则为:

1、整数类型(byte、short、int、long)的基本类型变量的默认值为0。

2、单精度浮点型(float)的基本类型变量的默认值为0.0f。

3、双精度浮点型(double)的基本类型变量的默认值为0.0d。

4、字符型(char)的基本类型变量的默认为 “/u0000”。

5、布尔性的基本类型变量的默认值为 false。

6、引用类型的变量是默认值为 null。

7、数组引用类型的变量的默认值为 null。春关键数组变量的实例后,如果没有没有显示的为每个元素赋值,Java 就会把该数组的所有元素初始化为其相应类型的默认值。

局部变量初始化

局部变量声明以后,Java 虚拟机不会自动的为它初始化为默认值。因此对于局部变量,必须先经过显示的初始化,才能使用它。

如果编译器确认一个局部变量在使用之前可能没有被初始化,编译器将报错。

那么,加了修饰的java成员变量是如何初始化的呢?在何时?在程序中的什么位置?

public class TestC {/** 定义成员变量* 尾数为1表示定义时进行初始化赋值* 尾数为2表示在代码块中进行初始化赋值* 尾数为3表示在构造函数中进行初始化赋值* 尾数为4表示在静态代码块中进行初始化赋值* 尾数为5表示不初始化赋值*//** 普通成员变量 */int field_a1 = 5;int field_a2;int field_a3;//报错:不能再静态代码块中使用非静态变量。 Cannot make a static reference to the non-static field field_a4//int field_a4;int field_a5;/** final 成员变量*/final int  field_b1 = 5;final int  field_b2;final int  field_b3;//报错:不能再静态代码块中使用非静态变量。Cannot make a static reference to the non-static field field_b4//final int  field_b4;//报错:未初始化 。The blank final field field_b5 may not have been initialized//final int  field_b5;/** static成员变量*/static int field_c1 = 5;static int field_c2;static int field_c3;static int field_c4;static int field_c5;/** static final 成员变量*/static final int field_d1 = 5;//报错:未初始化 。The blank final field field_d2 may not have been initialized//static final int field_d2;//报错:未初始化 。The blank final field field_d3 may not have been initialized//static final int field_d3;static final int field_d4;//报错:未初始化 。The blank final field field_d5 may not have been initialized//static final int field_d5;//代码块{field_a2 = 5;field_b2 = 5;field_c2 = 5;//field_d2 = 5;}//静态代码块static{//field_a4 = 5;//field_b4 = 5;field_c4 = 5;field_d4 = 5;}//构造函数public TestC(){field_a3 = 5;field_b3 = 5;field_c3 = 5;//field_d3 = 5;}
}

然后我们对这个程序生成的.class文件进行反编译,看看他是如何运行的。

下面是TestC.jad文件。反编译文件

public class TestC
{public TestC(){field_a1 = 5;field_a2 = 5;field_c2 = 5;field_a3 = 5;field_c3 = 5;}int field_a1;int field_a2;int field_a3;int field_a5;final int field_b1 = 5;final int field_b2 = 5;final int field_b3 = 5;static int field_c1 = 5;static int field_c2;static int field_c3;static int field_c4 = 5;static int field_c5;static final int field_d1 = 5;static final int field_d4 = 5;}
  • 对于不加修饰的普通成员变量,无论我们在什么地方对其进行初始化赋值,系统都会默认在构造函数中进行赋值。
  • 对于final变量,无论我们在什么地方进行赋值,系统会默认final变量是在类中进行初始化。
  • 对于static,系统会根据我们的需求,而在不同位置进行初始化。

通过报错,我们可以发现。

  • final变量必须进行初始化。否则就会报编译错误。The blank final field field_d5 may not have been initialized
  • static成员变量的初始化发生在类被类加载器(classLoader)加载的时候系统会对没有初始化的静态成员变量在静态区进行默认赋值。
  • 普通成员变量的初始化发生在JVM为类生成实例开辟空间的时候进行默认初始化赋值。

总结

final修饰的变量必须显性进行初始化。初始化有三种方式:

  1. 直接初始化

  2. 动态代码块

  3. 构造函数

  • 如果一个变量既被final修饰又被static修饰,那么这个变量一定要被初始化(满足final特性),另外要么直接初始化要么在静态代码块中进行初始化(满足static特性)。
  • final修饰的变量的初始化先于static修饰的变量,static修饰的变量先于普通变量的初始化。
  • 如果是final级别的,那么虽然也是根据代码次序的前后顺序进行初始化,但是它是在编译阶段进行宏替换,即在编译阶段就知道了值,因此在加载运行阶段对这一先后顺序完全感知不到。
  • 但是如果是static级别的,代码的先后顺序会造成程序运行结果的不同。因为它们都是在加载进行的时候进行初始化的。

归结如下:

  1. final修饰的变量在编译阶段完成
  2. static修饰的变量在一个静态代码块中进行初始化
  3. 普通变量在构造函数中进行初始化

Java类初始化、变量初始化相关推荐

  1. java类中变量初始化

    一般的初始化 public class BedAndBreakfast {// initialize to 10public static int capacity = 10;// initializ ...

  2. java类成员变量初始化_探讨Java类中成员变量的初始化方式

    在 Java 里定义一个类的时候,很多时候我们需要提供成员变量,成员变量专业叫法是 Memeber Variable 或者干脆的叫作 Field. 根据是否使用 static 关键字修饰,可以将 Fi ...

  3. Java类中变量初始化顺序

    下面代码显示了静态初始化代码块,非静态实例初始化代码块,构造函数 等在Java中从代码载入内存到代码执行过程的执行顺序: import static net.mindview.util.Print.* ...

  4. c++构造函数以及类中变量初始化顺序

    c++构造函数以及类中变量初始化顺序 Submitted by ant on Fri, 03/29/2013 - 20:05 构造函数 c++ 的类提供了一种抽象机制,使用起来要比 c 方便很多.为了 ...

  5. java类的静态成员初始化_Java类的初始化顺序 (静态变量、静态初始化块、变量、初始......

    很有意思的一篇文章 1.没有继承 静态变量->静态初始化块->变量->变量初始化块->构造方法 2.有继承的情况 父类静态变量->父类静态初始化块->子类静态变量- ...

  6. 吐槽C++:C++ 类成员变量初始化 之 初始化带有参数的构造函数 的类成员变量。...

    本来我想写这样的代码: class MatchManager{ public:MatchManager(){}class OnTimerRunFuncHelper{public:OnTimerRunF ...

  7. Java类和对象初始化

    首先对Java 较为深层技术提几个问题(包含class 文件格式的了解): 1.类的访问权限在class二进制文件中怎么体现的? 2.类中static 区域 怎么初始化的,时间,顺序,特点是什么? 3 ...

  8. java 类 加载 初始化_java中类的初始化和加载

    最近在阅读孙卫琴的java面向对象一书中,看到对java中类的初始化和加载中的论述比较系统,故笔记之 1)类的初始化,JAVA在初始化一个类时,以下步骤 A 假如类存在直接的父类,并且这个父类还没有初 ...

  9. JAVA笔记(2)变量初始化,数组,包,继承,修饰符

    变量初始化 未初始化的变量不能被使用.声明一个对象时要为他分配内存 Object obj=new Object(); int对象初始化时要为他指定内存. int i = 10; int[] a = n ...

  10. java基础static变量初始化和赋值的例子

    1.代码案例 public class A {public static int x;static{x = B.y+ 1;} } public class B {public static int y ...

最新文章

  1. Java基于Socket文件传输示例
  2. SpringBoot日志收集-Aop方式-存进数据库一起来和我看看咋收集日志吧!!
  3. 在Lucene.net实现自定义排序
  4. tcp底层连接过程(c语言)
  5. SAP Spartacus pop over 元素的单元测试
  6. [密码学基础][每个信息安全博士生应该知道的52件事][Bristol Cryptography][第13篇]概述投影点表达的用途的优点
  7. 使用docker部署mysql主从复制集群
  8. c语言变量加常量,C语言(二)---常量与变量(示例代码)
  9. python运行input不出结果_Python中print和input调用了Python中底层的什么方法
  10. android listview 移动到顶部,android listview滚动到顶部
  11. 1.4 Documents,Fields和Schema设计--目录
  12. 高效算法:竞赛、应试与提高必修128例
  13. 安卓如何修改dns服务器地址,安卓手机怎么修改DNS?安卓手机修改DNS服务器图文详情介绍[多图]...
  14. 信息安全-终端安全-Windows安全配置
  15. Qualcomm msm8916 MIPI to RGB 调试
  16. 服务器芯片和一般电脑芯片的区别,服务器CPU和PC的CPU区别
  17. hive时空链战_时空链战Chain Strike游戏电脑版下载_时空链战Chain Strike最新电脑版下载_18183手机游戏下载...
  18. 联合证券|“仰望”概念爆发,多股涨停!人气龙头股罕见“炸板”
  19. webservice接口等待时间_调用webservice超时问题的解决
  20. 一个员工的离职成本有多高,超出想象

热门文章

  1. vulhub-thinkphp漏洞复现
  2. Mindjet MindManager使用问题及解决之道
  3. 【百度经验中excel VBA凑发票程序修改版】
  4. SokkiA全站仪 .sdr数据格式说明
  5. Camera ISP 转
  6. hive-beeline
  7. linux64位系统兼容32位程序(不下载兼容包)
  8. java中 amp_Java中amp;、|、amp;amp;、||详解
  9. 华为提出PyramidTNT:用金字塔结构改进Transformer!涨点明显!
  10. 学习笔记0330----linux软件安装卸载