是编译器还是JVM分配的默认字段值?

 允儿nothing 发布于 2023-01-18 13:32

我有一个问题:在java中我们声明int,long,double等,(原始数据)或非原始(对象数据),没有使用默认值初始化,但在运行时它将采用默认值.现在我的问题是哪一个分配默认值:java编译器或Java虚拟机(JVM)?

例如:

int x;
System.out.println(x) //Result is 0;

T8Z.. 11

Java中有三种不同类型的声明变量.它们是实例,类和局部变量.

实例变量

实例变量是类的非静态字段,通常简称为字段.

原始数字字段初始化为0.这包括byte,short,int,long,floatdouble.

booleans初始化为false.

chars初始化为空字符\u0000.

引用类型初始化为null.

类变量

类变量是声明为static的类中的字段,通常称为静态变量或静态字段.它也与实例变量初始化相同.

局部变量

局部变量是方法中定义的变量,包括任何方法参数.必须在使用前初始化局部变量.它们没有默认值.

创建方法时,JVM将完成初始化过程.

2 个回答
  • 字段的默认值由JVM在运行时分配.从JLS 15.9.4(强调我的):

    新对象包含在指定类类型及其所有超类中声明的所有字段的新实例.在创建每个新字段实例时,会将其初始化为其默认值.

    当然,鉴于这种行为在JLS中是标准化的,编译器可以想象利用它来基于未初始化字段以其默认值开始的假设来执行某些优化.

    无论它们是什么类型(null对于引用类型),字段都被初始化为等价的0 .本文给出了一个很好的列表:

    Data Type:              Default Value:
    boolean                 false 
    char                    \u0000 
    int,short,byte / long   0 / 0L 
    float / double          0.0f / 0.0d 
    any reference type      null
    

    局部变量没有给出初始值,如果在使用之前未通过所有可能的代码路径为它们分配值,则使用它们是编译器错误.

    请注意,在创建新数组时,数组元素也会自动初始化为默认值(例如,每个元素都new int[100]将初始化为0).这适用于field和local数组变量.

    2023-01-18 13:34 回答
  • Java中有三种不同类型的声明变量.它们是实例,类和局部变量.

    实例变量

    实例变量是类的非静态字段,通常简称为字段.

    原始数字字段初始化为0.这包括byte,short,int,long,floatdouble.

    booleans初始化为false.

    chars初始化为空字符\u0000.

    引用类型初始化为null.

    类变量

    类变量是声明为static的类中的字段,通常称为静态变量或静态字段.它也与实例变量初始化相同.

    局部变量

    局部变量是方法中定义的变量,包括任何方法参数.必须在使用前初始化局部变量.它们没有默认值.

    创建方法时,JVM将完成初始化过程.

    2023-01-18 13:37 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有