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

作者:爱唱歌的瓜皮 时间:2023-01-05 15:55:49 

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

Java虚拟机会对类的实例对象进行分配内存,在分配内存后,会将内存空间(除了对象头)全部初始化为零值。这就保证了,在类的定义过程中,不给字段赋初始值,实例对象也能有初始值。

下面是在Java类中各字段的初始值

字段默认初始值
对象null
数值(byte,short,int,long,float,double)0或0.0
booleanfalse
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

标签:Java,字段,初始值
0
投稿

猜你喜欢

  • HashMap 和 HashSet的区别

    2023-01-05 22:45:30
  • Android实现Back功能代码片段总结

    2021-05-27 01:33:06
  • C#实现Check Password和锁定输错密码锁定账户功能

    2023-01-20 03:04:33
  • java模拟hibernate一级缓存示例分享

    2023-06-18 08:43:55
  • C#调用新浪微博API实例代码

    2022-12-21 14:02:15
  • 微信小程序获取手机号,后端JAVA解密流程代码

    2023-11-29 07:57:26
  • c#实现ini文件读写类分享

    2022-08-31 09:47:48
  • Android编程实现状态保存的方法分析

    2023-07-17 12:54:45
  • 关于统计数字问题的算法

    2023-11-03 00:33:32
  • Java反转链表测试过程介绍

    2022-10-02 20:10:03
  • 解决android关于打开虚拟机时右侧工具栏不显示的问题

    2023-02-24 12:42:54
  • Android 知乎广告效果实现代码

    2022-12-02 08:50:12
  • Mybatis工具类JdbcTypeInterceptor运行时自动添加jdbcType属性

    2023-08-24 03:49:59
  • C#中流的使用和分类

    2022-10-04 22:17:41
  • 详解C# 中的正则表达式运用

    2023-04-20 06:35:03
  • C#语言中字符类char的使用方法(总结)

    2022-09-04 17:25:43
  • c#文件名/路径处理方法示例

    2021-11-28 21:02:40
  • Unity Shader实现线框效果的制作步骤

    2023-10-10 06:14:54
  • unity 切换场景不销毁物体问题的解决

    2022-04-29 11:26:06
  • C#双缓冲技术实例详解

    2023-02-02 15:56:37
  • asp之家 软件编程 m.aspxhome.com