鍍金池/ 問答/Java/ java 為什么在代碼塊里不用聲明變量的類型

java 為什么在代碼塊里不用聲明變量的類型

 class InstanceInitTest{
{
    a = 6;
}
int a = 9;
public static void main(String[] args)
{
    System.out.println(new InstanceInitTest().a);
}}

這段代碼的執(zhí)行順序是: 變量 int a =6 然后是代碼塊a=6 那為什么最后new InstanceInitTest().a的結(jié)果不是6 ,而是9呢,好奇怪???

回答
編輯回答
墨小白

因?yàn)橹皇?strong>賦值不是聲明
代碼中的代碼會被加到構(gòu)造方法的最前面執(zhí)行

2017年10月14日 05:31
編輯回答
懶豬

類初始化時(shí)普通代碼和非靜態(tài)成員變量的執(zhí)行順序取決于代碼的順序,所以你的代碼是
bipush 6:把整數(shù)6壓入棧
putfield :把成員變量的值設(shè)為棧中的值6
后面int a = 9;
bipush 6:把整數(shù)9壓入棧
putfield :把成員變量的值設(shè)為棧中的值9
所以最后打印的是9
字節(jié)碼指令如下:
圖片描述

如果交換成員變量和普通代碼塊的順序,結(jié)果就相反了。
圖片描述

補(bǔ)個(gè)圖,在Test構(gòu)造器執(zhí)行前int a已經(jīng)聲明好了,這應(yīng)該是類加載的鏈接階段做的,還未執(zhí)行任何代碼的時(shí)候。

2018年7月5日 21:19