Java类中字段可以不赋予初始值的原因分析

 更新时间:2021年09月01日 11:29:58   作者:爱唱歌的瓜皮  
这篇文章主要介绍了Java类中字段可以不赋予初始值的原因分析,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

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变量属于类,在调用构造函数之前就已经被系统赋予默认值了。

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

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • java中的动态代理与责任链模式详解

    java中的动态代理与责任链模式详解

    这篇文章主要介绍了java中的动态代理与责任链模式详解,动态代理提供了一种灵活且非侵入式的方式,可以对对象的行为进行定制和扩展,它在代码重用、解耦和业务逻辑分离、性能优化以及系统架构中起到了重要的作用,需要的朋友可以参考下
    2023-08-08
  • Java零基础也看得懂的单例模式与final及抽象类和接口详解

    Java零基础也看得懂的单例模式与final及抽象类和接口详解

    本文主要讲了单例模式中的饿汉式和懒汉式的区别,final的使用,抽象类的介绍以及接口的具体内容,感兴趣的朋友来看看吧
    2022-05-05
  • JAVA 16位ID生成工具类含16位不重复的随机数数字+大小写

    JAVA 16位ID生成工具类含16位不重复的随机数数字+大小写

    这篇文章主要介绍了JAVA 16位ID生成工具类含16位不重复的随机数数字+大小写,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-02-02
  • Java FTPClient实现文件上传下载

    Java FTPClient实现文件上传下载

    这篇文章主要为大家详细介绍了Java FTPClient实现文件上传下载的相关资料,需要的朋友可以参考下
    2016-04-04
  • Springboot允许logger.debug输出日志方式

    Springboot允许logger.debug输出日志方式

    这篇文章主要介绍了Springboot允许logger.debug输出日志方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • Java8 CompletableFuture runAsync学习总结submit() execute()等

    Java8 CompletableFuture runAsync学习总结submit() execute()等

    这篇文章主要介绍了Java8 CompletableFuture runAsync学习总结submit() execute()等,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-10-10
  • Java实现文件变化监听代码实例

    Java实现文件变化监听代码实例

    这篇文章主要介绍了Java实现文件变化监听代码实例,通过定时任务,轮训查询文件的最后修改时间,与上一次进行对比,如果发生变化,则说明文件已经修改,进行重新加载或对应的业务逻辑处理,需要的朋友可以参考下
    2024-01-01
  • 图书管理系统java版

    图书管理系统java版

    这篇文章主要为大家详细介绍了java版的图书管理系统,通过实例为大家快速掌握数据库编程技术,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-06-06
  • Java实现PDF转为线性PDF详解

    Java实现PDF转为线性PDF详解

    线性化PDF文件是PDF文件的一种特殊格式,可以通过Internet更快地进行查看。本文将通过后端Java程序实现将PDF文件转为线性化PDF。感兴趣的可以了解一下
    2021-12-12
  • Java拷贝文件夹和删除文件夹代码实例

    Java拷贝文件夹和删除文件夹代码实例

    这篇文章主要介绍了Java拷贝文件夹和删除文件夹代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04

最新评论