Java变量的初始化问题探究
对于Java的变量,我们知道有成员变量和局部变量。
关于他们的初始化,基本上所有书上都会写。成员变量,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为类生成实例开辟空间的时候进行默认初始化赋值。
Java变量的初始化问题探究相关推荐
- java 变量初始化_浅谈Java变量的初始化顺序详解
规则1(无继承情况下):对于静态变量.静态初始化块.变量.初始化块.构造器,它们的初始化顺序依次是 (静态变量.静态初始化块)>(变量.初始化块)>构造器 证明代码: public cla ...
- java 变量不初始化_Java之哪些情况下变量不会初始化
类的属性,或者32313133353236313431303231363533e78988e69d8331333365633966叫值域 方法里的局部变量 方法的参数 对于第一种变量,Java虚拟机会 ...
- Java类的初始化、变量的初始化
Java类的初始化.变量的初始化 知识点 Java常量, final 修饰,值被设定后不能再被修改 静态变量里, static 修饰,顾名思义,无须创建对象,便可在内存中申请一个存储空间进行存储 ...
- java 静态方法 变量_Java变量的初始化及静态方法的实现
这篇文章主要介绍了Java变量的初始化及静态方法的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1.变量初始化 package treat; ...
- java long初始化_Java变量的初始化
Java变量默认值 Java变量的初始化,如果不赋值,将会有个默认值,对于基本类型,比如int,long是0, boolean 是false等,引用类型如果不设置,将会是null. package v ...
- java静态/动态成员变量、初始化块,父类/子类构造函数执行顺序问题
2019独角兽企业重金招聘Python工程师标准>>> /* * 几大原则 * 一.静态成员变量(Static) * 1.静态成员变量为类变量,所有对象共享同一内存空间 * 2.静态 ...
- java中的静态初始化是什么意思,Java中static静态变量的初始化完全解析
静态变量初始化顺序 1.简单规则 首先先看一段最普遍的JAVA代码: ? 这里先猜下控制台输出结果是什么? OK, 或许你已经猜到下面了结果了,那么你还是熟悉Java的. 复制代码 代码如下: 0 1 ...
- java 成员变量的初始化_Java类变量和成员变量初始化过程
一.类的初始化 对于类的初始化:类的初始化一般只初始化一次,类的初始化主要是初始化静态成员变量. 类的编译决定了类的初始化过程. 编译器生成的class文件主要对定义在源文件中的类进行了如下的更改: ...
- java变量不声明可以直接使用吗_我们可以在不使用Java进行初始化的情况下声明最终变量吗?...
在Java中,final是可与字段类和方法一起使用的access修饰符.当一个方法为final时,它不能被覆盖. 当变量为最终变量时,其值无法进一步修改. 当类结束时,不能扩展. 无需初始化即可声明最 ...
最新文章
- 小程序海外也能做吗?小程序海外主体公司开发的案例
- 页面加载进度条改进版
- Sinon.JS Sinon.JS
- Linux系统基本命令之vim编辑器的使用
- instant.now时区不正确_Centos8如何更改时区
- java继承层次结构,在状态模式中实现继承层次结构 - java
- php 降低图像大小,PHP图像重新调整大小
- IEnumerable.EachTSource(FuncTSource, TSource predicate) 逐个更改列表成员的值
- UVA - 1267 Network
- Android简单登录界面布局设计
- Axure RP8手机边框
- 一个程序员自媒体人的2017年终总结
- 北京二手房价预测(数据分析)
- 使用 T-SQL 语句完成数据库的创建、编辑、修改及删除
- android源生进度条,如何使用源生css3实现圆环加载进度条
- *.ftl文件中文乱码的问题
- 2022高处安装、维护、拆除特种作业证考试题库及答案
- cass怎么多级放坡_【干货】四面放坡且坡度不同的工程土方,CASS怎么算?
- Word加载项/插件管理
- assa_【脚本教程】ASSA指令解析与案例
热门文章
- 北京冬奥会科技感十足多家科技公司助力
- 苹果应用商店新增对“非公开上市”应用程序的支持
- 这就是即将发布的苹果刘海屏MacBook Pro样机?
- 特斯拉股价周一大跌8.55% 市值缩水640亿美元
- 特斯拉将美国政府告了:要求停止对华关税并退款!
- 微信被曝大“Bug”?有用户账户资金被盗刷,这个功能要慎用
- 杜海涛代言理财App翻车,4万人被骗超30亿,杜海涛姐姐却骂受害者活该?
- 拼多多联合三奇医卫等企业,每天上架1000万只平价口罩
- 腾讯视频向湖北地区用户推出1个月免费看活动
- 华为 P30系列最高补贴1200元!华为开启以旧换新服务了