static和static final的区别

JVM-static vs static final

如果不清楚JVM类加载过程请先看另一篇文章类加载系统

开发时我们经常用到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查看字节码文件

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

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

    1. 此处可以发现在字节码文件中已经写明了ConstantValue: String finalName, 这也就代表编译期间就已经有值了
    2. 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字段的初始化在编译期间就已经完成
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值