問題背景:想了解Java類非靜態(tài)成員變量以及靜態(tài)成員變量的初始化過程。在代碼塊中使用System.out.println輸出語句,輸出成員變量的值,但是出現(xiàn)非法引用的提示。具體代碼如下。具體代碼:classA{publicA(){System.out.println("父類A的構(gòu)造方法");System.out.println("靜態(tài)成員變量="+staticStr+",非靜態(tài)成員變量="+str);}{//System.out.println(str);//錯誤:非法前向引用str="123";System.out.println("父類A的構(gòu)造代碼塊0");}static{staticStr="1234";//System.out.println(staticStr);System.out.println("父類A的靜態(tài)代碼塊0");}privatestaticStringstaticStr=iniStaticStr();static{System.out.println(staticStr);System.out.println("父類A的靜態(tài)代碼塊");}privateStringstr=iniStr();{System.out.println(str);System.out.println("父類A的構(gòu)造代碼塊");}privatestaticStringiniStaticStr(){System.out.println("staticStr="+staticStr);System.out.println("靜態(tài)成員變量顯示初始化");return"iniStaticStr";}privateStringiniStr(){System.out.println("str="+str);System.out.println("非靜態(tài)成員變量顯示初始化");return"iniStr";}{//System.out.println(str);//錯誤:非法前向引用System.out.println("父類A的構(gòu)造代碼塊1");}static{System.out.println("父類A的靜態(tài)代碼塊1");}}classBextendsA{static{System.out.println("子類B的靜態(tài)代碼塊");}publicB(){System.out.println("子類B的構(gòu)造方法");}{System.out.println("子類B的構(gòu)造代碼塊");}}publicclassJavaTest1{publicstaticvoidmain(String[]args){newB();}}輸出結(jié)果:父類A的靜態(tài)代碼塊0staticStr=1234靜態(tài)成員變量顯示初始化iniStaticStr父類A的靜態(tài)代碼塊父類A的靜態(tài)代碼塊1子類B的靜態(tài)代碼塊父類A的構(gòu)造代碼塊0str=123非靜態(tài)成員變量顯示初始化iniStr父類A的構(gòu)造代碼塊父類A的構(gòu)造代碼塊1父類A的構(gòu)造方法靜態(tài)成員變量=iniStaticStr,非靜態(tài)成員變量=iniStr子類B的構(gòu)造代碼塊子類B的構(gòu)造方法具體問題描述:1、代碼塊與成員變量的執(zhí)行順序是怎樣的?如果代碼塊先于成員變量執(zhí)行,那此時(shí)的成員變量并沒用被聲明,那為什么能對成員變量進(jìn)行賦值?2、假如是成員變量先于代碼塊執(zhí)行,為什么代碼塊中使用System語句輸出操作會提示非法向前引用?3、成員變量的初始化過程是否是一下過程?1)默認(rèn)初始化2)顯示初始化(包括代碼塊中的顯示初始化)3)構(gòu)造初始化
Java編譯時(shí)提示非法向前引用
慕哥6287543
2019-05-22 21:25:02