java中存在各种变量,我们来讨论下各变量的分配空间时机和初始化时机。

public TestClass(){  
	private final Long finalLong = 5;  
	// 这里被final修饰的变量finalStr,直接成为常量,编译时就会被分配为5;  
	private static Long staticLong = 1;  
	// 静态变量staticLongr, 静态字段在[[准备]]阶段只会被赋值为0,[[初始化]]时才会被赋值为1。  
	private Long memberLong = 1;  
	// 成员变量,在new的时候分配空间和初始化。  
	private static void newInstance(){  
		TestClass testClass = new TestClass();  
		// testClass 是分配在栈中,指向分配在TestClass的堆对象。  
	}  
}

final修饰的变量 编译时,变成常量
类静态变量 在准备阶段赋值为0, 在初始化阶段赋值为1 。 分配在方法区
实例变量 在new的时候,分配空间和初始化,在JAVA堆
局部变量 在创建的时候赋值。 分配在栈中