Java中static和static final的区别详解

 更新时间:2023年10月26日 08:35:13   作者:码农回忆录  
这篇文章主要介绍了Java中static和static final的区别详解,开发时我们经常用到static以及static final来修饰我们的字段变量,那么他们到底有什么区别呢?其实他们的区别可以用使用字节码文件来解析,需要的朋友可以参考下

1. 准备测试代码

package com.hgy;

import java.util.Arrays;
import java.util.List;

public class hello {

	private static String name = "hello";
	private static final String finalName = "finalName";

	public static void main(String[] args) {
		System.out.println(name);

	}
}

2. 利用idea中的插件jclasslib查看字节码文件

找到method下面的此方法不是我们编写的,而是java自动给我们添加上的用于执行类加载时静态变量以及静态代码块的内容; 这里的字节码命令很简单,就是加载了hello然后赋值给了那么最后返回了;此处你会发现并没有final修饰的字段的初始化。实际上final字段修饰的已经在编译期间就确定了值不需要在加载的时候赋值

在这里插入图片描述

final字段的字节码文件(删除了其他干扰信息的字节码文件)

  • 此处可以发现在字节码文件中已经写明了ConstantValue: String finalName, 这也就代表编译期间就已经有值了
  • static块的内容也就是上图看到的内容
{
  public static final java.lang.String finalName;
    descriptor: Ljava/lang/String;
    flags: (0x0019) ACC_PUBLIC, ACC_STATIC, ACC_FINAL
    ConstantValue: String finalName

  static {};
    descriptor: ()V
    flags: (0x0008) ACC_STATIC
    Code:
      stack=1, locals=0, args_size=0
         0: ldc           #6                  // String hello
         2: putstatic     #7                  // Field name:Ljava/lang/String;
         5: return
      LineNumberTable:
        line 8: 0
}
SourceFile: "hello.java"

3.总结

static修饰的字段的值,会在类加载阶段的初始化阶段进行内容初始化static final字段的初始化在编译期间就已经完成

到此这篇关于Java中static和static final的区别详解的文章就介绍到这了,更多相关static和static final的区别内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

到此这篇关于Java中static和static final的区别详解的文章就介绍到这了,更多相关static和static final的区别内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java高并发ScheduledThreadPoolExecutor与Timer区别

    java高并发ScheduledThreadPoolExecutor与Timer区别

    这篇文章主要为大家介绍了java高并发ScheduledThreadPoolExecutor与Timer区别,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-10-10
  • java异步调用Feign接口空指针问题解决

    java异步调用Feign接口空指针问题解决

    这篇文章主要为大家介绍了java异步调用Feign接口空指针问题解决方法详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-06-06
  • JDK1.8中ArrayList是如何扩容的

    JDK1.8中ArrayList是如何扩容的

    本文基于此出发讲解ArrayList的扩容机制,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-12-12
  • SpringBoot集成yitter-idgenerator(雪花漂移)分布式Id自增的实现

    SpringBoot集成yitter-idgenerator(雪花漂移)分布式Id自增的实现

    本文主要介绍了SpringBoot集成yitter-idgenerator(雪花漂移)分布式Id自增的实现,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • Java集合Map常见问题_动力节点Java学院整理

    Java集合Map常见问题_动力节点Java学院整理

    这篇文章主要为大家详细整理了Java集合Map常见问题,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-05-05
  • Java continue break制作简单聊天室程序

    Java continue break制作简单聊天室程序

    这篇文章主要为大家详细介绍了Java continue break制作简单聊天室程序,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-10-10
  • SpringCloud zuul 网关如何解决跨域问题

    SpringCloud zuul 网关如何解决跨域问题

    这篇文章主要介绍了SpringCloud zuul网关解决跨域问题的具体实现方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • java去除空格、标点符号的方法实例

    java去除空格、标点符号的方法实例

    这篇文章主要给大家介绍了关于java去除空格、标点符号的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • 编译大型Java项目class冲突导致报错的解决方案

    编译大型Java项目class冲突导致报错的解决方案

    这篇文章给大家盘点编译大型项目class冲突导致报错的解决方案,文中通过代码示例介绍的非常详细,具有一定的参考价值,需要的朋友可以参考下
    2023-10-10
  • Spring深入分析讲解BeanUtils的实现

    Spring深入分析讲解BeanUtils的实现

    java知识体系统有很多数据实体,比较常用的DTO、BO、DO、VO等,其他类似POJO概念太老了现在基本废弃掉了,本篇幅直接忽略,对于这几种数据实体各自代表的含义和应用场景先做一下简单描述和分析
    2022-06-06

最新评论