Java成员变量初始化顺序

本文深入解析Java中类变量和实例变量的初始化过程,包括初始化时机、顺序及代码示例,通过javap工具展示变量赋值的内部机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Java中成员变量分为两类:1、类变量 2、实例变量

1、类变量初始化

类变量简单来说就是被static修饰的变量,类变量属于类本身

1.1 初始化时机

  • 定义类变量时指定初始化
  • 静态代码块中对类变量指定初始化

1.2 初始化顺序

上述两种方式在程序中的排列顺序即为执行顺序

class ClassVarInit{
	static int value=10;
	static{
		value=100;
		name="静态代码块中对类变量指定初始化";
	}
	static String name="定义类变量时指定初始化";
	public static void main(String[] args){
		System.out.println(value);//输出:100
		System.out.println(name);//输出:"定义类变量时指定初始化"
	}
}

利用javap工具可以明显的看到类变量的赋值顺序

javap -c ClassVarInit.class
Compiled from "ClassVarInit.java"
public class demo.ClassVarInit {
  static int value;

  static java.lang.String name;

  public demo.ClassVarInit();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang
/Object."<init>":()V
       4: return

  public static void main(java.lang.String[]);
    Code:
       0: getstatic     #2                  // Field java/lang/
System.out:Ljava/io/PrintStream;
       3: getstatic     #3                  // Field value:I
       6: invokevirtual #4                  // Method java/io/P
rintStream.println:(I)V
       9: getstatic     #2                  // Field java/lang/
System.out:Ljava/io/PrintStream;
      12: getstatic     #5                  // Field name:Ljava
/lang/String;
      15: invokevirtual #6                  // Method java/io/P
rintStream.println:(Ljava/lang/String;)V
      18: return

  static {};
    Code:
       0: bipush        10
       2: putstatic     #3                  // Field value:I
       5: bipush        100               
       7: putstatic     #3                  // Field value:I
      10: ldc           #7                  // String 静态代码
块中对类变量指定初始化
      12: putstatic     #5                  // Field name:Ljava
/lang/String;
      15: ldc           #8                  // String 定义类变
量时指定初始化
      17: putstatic     #5                  // Field name:Ljava
/lang/String;
      20: return
}

2、实例变量初始化

实例变量属于实例对象

2.1 初始化时机

  • 定义实例变量时指定初始化
  • 非静态代码块中对实例变量指定初始化
  • 构造器中对实例变量指定初始化

2.2 初始化顺序

前两种方式在程序中的排列顺序即为执行顺序,且都优先于构造器初始化

class InstanceVarInit{
	public InstanceVarInit(int value,String name){
		this.value=value;	
		this.name=name;
	}
	int value=10;
	{
		value=100;
		name="非静态代码块中对实例变量指定初始化";
	}
	String name="定义实例变量时指定初始化";
	public static void main(String[] args){
		InstanceVarInit obj=new InstanceVarInit(1000,"构造器中对实例变量指定初始化");	
		System.out.println(obj.value);//输出:1000
		System.out.println(obj.name);//输出:"构造器中对实例变量指定初始化"
	}
}
javap -c InstanceVarInit.class
Compiled from "InstanceVarInit.java"
public class demo1.InstanceVarInit {
  int value;

  java.lang.String name;

  public demo1.InstanceVarInit(int, java.lang.String);
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang
/Object."<init>":()V
       4: aload_0
       5: bipush        10
       7: putfield      #2                  // Field value:I
      10: aload_0
      11: bipush        100
      13: putfield      #2                  // Field value:I
      16: aload_0
      17: ldc           #3                  // String 非静态代
码块中对实例变量指定初始化
      19: putfield      #4                  // Field name:Ljava
/lang/String;
      22: aload_0
      23: ldc           #5                  // String 定义实例
变量时指定初始化
      25: putfield      #4                  // Field name:Ljava
/lang/String;
      28: aload_0
      29: iload_1
      30: putfield      #2                  // Field value:I
      33: aload_0
      34: aload_2
      35: putfield      #4                  // Field name:Ljava
/lang/String;
      38: return

  public static void main(java.lang.String[]);
    Code:
       0: new           #6                  // class demo1/Inst
anceVarInit
       3: dup
       4: sipush        1000
       7: ldc           #7                  // String 构造器中
对实例变量指定初始化
       9: invokespecial #8                  // Method "<init>":
(ILjava/lang/String;)V
      12: astore_1
      13: getstatic     #9                  // Field java/lang/
System.out:Ljava/io/PrintStream;
      16: aload_1
      17: getfield      #2                  // Field value:I
      20: invokevirtual #10                 // Method java/io/P
rintStream.println:(I)V
      23: getstatic     #9                  // Field java/lang/
System.out:Ljava/io/PrintStream;
      26: aload_1
      27: getfield      #4                  // Field name:Ljava
/lang/String;
      30: invokevirtual #11                 // Method java/io/P
rintStream.println:(Ljava/lang/String;)V
      33: return
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值