Java类中字段可以不赋予初始值的原因分析
作者:爱唱歌的瓜皮 发布时间:2023-01-05 15:55:49
Java类中字段可以不赋予初始值的原因
Java虚拟机会对类的实例对象进行分配内存,在分配内存后,会将内存空间(除了对象头)全部初始化为零值。这就保证了,在类的定义过程中,不给字段赋初始值,实例对象也能有初始值。
下面是在Java类中各字段的初始值
字段 | 默认初始值 |
对象 | null |
数值(byte,short,int,long,float,double) | 0或0.0 |
boolean | false |
char | \u0000(输出出来是空值) |
class Solution {
private static char c;
private static int i;
private static long l;
private static float f;
private static double d;
private static String s;
private static boolean bl;
private static byte b;
public static void main(String[] args) {
System.out.println(c == '\u0000');
System.out.print(c);
System.out.println(i);
System.out.println(l);
System.out.println(f);
System.out.println(d);
System.out.println(s);
System.out.println(bl);
System.out.println(b);
}
}
/*输出结果
true
0
0
0
0
0.0
0.0
null
false
*/
Java中类属性的初始化
我们知道一个类(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://blog.csdn.net/qq_42520962/article/details/108749437


猜你喜欢
- maven scope provided和runtime例子maven常用的scope有compile,provided,runtime,t
- 一、简介前面介绍了平时用到的大多数的多线程的例子,但在实际开发中使用的线程往往是大量的和更为复杂的,这时,每次都创建线程、启动线程。从性能上
- 转TXT文件public object DataTableToTXT(DataTable vContent, string vOutputF
- Android中Uri和Path之间的转换原因调用系统拍照应用,拍照后要保存图片,那么我们需要指定一个存储图片路径的Uri。这就涉及到如何将
- XML假如有这样一个XML格式的数据:<?xml version="1.0" encoding="utf
- 前言最近写了篇有关Eclipse工程转Android Studio工程的文章,而导致公司项目需要转 AS 的直接原因,就是今天要写的主题–方
- 本文实例为大家分享了WPF实现轮播图切换效果的具体代码,供大家参考,具体内容如下实现效果如下:步骤:1、自定义控件MyImageContro
- checkpoint 机制的具体实现我们都知道为了优化分布式存储系统中 NameNode 的重启性能,我们引进了 checkpoint 机制
- 一、前言 做过系统参数设置的同学们,肯定遇到过要提供一系列具有相同特点的选项供用户选择。
- 本文实例为大家分享了android点击按钮切换不同布局的具体代码,供大家参考,具体内容如下先上效果图:如图所示,实现点击下面的按钮切换不同的
- package com.infomorrow.parser_report;import org.junit.Test;public clas
- 一、概述解决ANR一直是Android 开发者需要掌握的重要技巧,一般从三个方面着手。开发阶段:通过工具检查各个方法的耗时,卡顿情况,发现一
- 刚刚接触Java不久,写法上和一些术语还不是很熟悉,如有不对的地方,希望指正。本次学生成绩系统要求能实现成绩录入, * ,绩点计算,退出系
- 首先是“饿了么”导航Tab栏悬浮的效果图。大家可以看到上图中的“分类”、“排序”、“筛选”会悬浮在app的顶部,状态随着ScrollView
- IDEA版本:2020.3具体步骤一、开启IDEA的自动编译【静态】1.File->Settings。2.直接搜索Compiler,选
- 前言:本文主要讲解以c语言编写猜数字游戏,目的是介绍C语言中的循环和分支的具体用法。一:猜数字游戏基本介绍&对程序预期.猜数字游戏,
- 1、装箱和拆箱是一个抽象的概念 2、装箱是将值类型转换为引用类型 ;拆箱是将引用类型转换为值类型利用装箱和拆箱功能,可通过允许值类型的任何值
- 方案一: 采用reflections 框架(此框架依赖com.google.guava)1、reflections框架地址:https://
- 什么是动态线程池?在线程池日常实践中我们常常会遇到以下问题:代码中创建了一个线程池却不知道核心参数设置多少比较合适。参数设置好后,上线发现需
- 01.点明观点C#中,非托管资源使用之后必须释放,而using()是使用非托管资源的最佳方式,可以确保资源在代码块结束之后被正确释放,并且代