这是什么操作?java中的变量竟然可以先使用后声明?

相信大家在看到标题之后,是疑惑的点进来看内容的。

在看到标题之后,大家肯定会怀疑,我赵某人用java写了好几年的代码了,还真就没见过java中的变量能先用在声明,今天就是进来看看你在没有声明变量的前提下是怎么用的!怎么用的!!!

各位,先别激动,能不能你先自己看,我们先来写个例子:

/**
 * 
*    
* 项目名称:BianChengXiGuan   
* 类名称:TestMain   
* 类描述:   静态变量
* 创建人:Mu Xiongxiong  
* 创建时间:2020-6-17 下午10:53:54   
* 修改人:Mu Xiongxiong   
* 修改时间:2020-6-17 下午10:53:54   
* 修改备注:   
* 个人博客:https://blog.csdn.net/qq_34137397
* 微信公众号:雄雄的小课堂
* @version    
*
 */
public class TestMain {
	
	public static int num = 10;
	static{
		num = 100;
	}
	
	public static void main(String[] args) {
		System.out.println(num);
	}

}

这个例子很简单,输出结果我不说大家也都知道,是100,正确。那么我们稍微改一下上面的代码:

/**
 * 
*    
* 项目名称:BianChengXiGuan   
* 类名称:TestMain   
* 类描述:   静态变量
* 创建人:Mu Xiongxiong  
* 创建时间:2020-6-17 下午10:53:54   
* 修改人:Mu Xiongxiong   
* 修改时间:2020-6-17 下午10:53:54   
* 修改备注:   
* 个人博客:https://blog.csdn.net/qq_34137397
* 微信公众号:雄雄的小课堂
* @version    
*
 */
public class TestMain {
	
	static{
		num = 100;
	}
	public static int num = 10;
	
	public static void main(String[] args) {
		System.out.println(num);
	}

}

注意了,我将声明num的和赋值num的代码替换了位置,你肯定会问:兄弟,你这代码能编译通过吗?即便你能编译通过,那输出来是多少???(这里可以看到num是先赋值后声明的)

这段代码可以编译通过,并且输出的num结果是10,是不是有点出乎意料了,不着急,要想把这里说通,我们还得回到静态变量的诞生说起,总所周知,静态变量是在我们第一次使用类(加载类)的时候别分配到数据区的,它在内存中之后一次拷贝,不会被分配多次,其后不管给它赋值多少遍,都是值在改变,而地址不变。

当类被加载时,首先会找到类中的所有静态声明,然后给它们分配空间,这个时候仅仅只是分配空间,并未赋值,此后,JVM就会根据静态赋值或者静态块的先后顺序去执行,到这里相信大家差不多就明白了。

回到我们的代码中,TestMain类被加载时,JVM首先在内存中开辟出了一块空间,并且将该地址传递给num,也就是执行的是public static int num,其次按照先后顺序,就该执行num = 100;了,接着往下执行,碰到了num = 10;显而易见,最后输出的结果就是num为10,谁在最后,谁说了算!

最后温馨提示一下大家,正常情况下,我们还是先声明在赋值比较靠谱点,免得本来想装个大神来着,结果出现了语料未及的结果,造成没必要的麻烦可就不值得了。
在这里插入图片描述

原文地址:https://www.cnblogs.com/a1111/p/13297054.html