第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會有你想問的

Java編譯時(shí)提示非法向前引用

Java編譯時(shí)提示非法向前引用

慕哥6287543 2019-05-22 21:25:02
問題背景:想了解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)造初始化
查看完整描述

2 回答

?
墨色風(fēng)雨

TA貢獻(xiàn)1853條經(jīng)驗(yàn) 獲得超6個(gè)贊

這種情況:
{
System.out.println("6666");
}
inta=10;
執(zhí)行順序由代碼順序決定。
這種情況:
{
a=10;
}
inta;
inta;
{
a=10;
}
等價(jià),字節(jié)碼指令一樣
                            
查看完整回答
反對 回復(fù) 2019-05-22
?
繁星coding

TA貢獻(xiàn)1797條經(jīng)驗(yàn) 獲得超4個(gè)贊

首先,關(guān)于執(zhí)行順序問題。主要有以下幾個(gè)要點(diǎn):
變量的聲明在任意代碼執(zhí)行前發(fā)生(類似于privateStringstr這樣的聲明并不是可執(zhí)行代碼)
接下來是靜態(tài)塊、靜態(tài)變量的聲明時(shí)賦值語句,會被合并在一起執(zhí)行,執(zhí)行順序就是它們在代碼中的書寫順序
接下來是實(shí)例塊、實(shí)例變量的聲明時(shí)賦值語句、以及構(gòu)造方法,前兩者按照書寫順序執(zhí)行,構(gòu)造方法最后執(zhí)行
關(guān)于執(zhí)行順序,你可以對照你程序的打印輸出來看,應(yīng)該就能明白了。
下面再來說說非法向前引用這個(gè)錯誤。
前面說過,所有變量的聲明都是在任意代碼執(zhí)行前發(fā)生的,那么按道理來說并不存在“向前引用”一說,因?yàn)槿我痪浯a執(zhí)行時(shí)變量肯定已經(jīng)存在了才對。
那么這個(gè)錯誤究竟是怎么出現(xiàn)的呢?答案是:
這是Java編譯器強(qiáng)制進(jìn)行的一個(gè)檢查
其目的是避免循環(huán)初始化和其他非正常的初始化行為。
所以,雖然你的代碼看起來沒有問題,但是卻無法通過編譯器的強(qiáng)制檢查,所以報(bào)錯。
那么為什么類似于staticStr="1234";這樣的代碼可以呢?這是因?yàn)镴ava對其中的某些情況做了“特許”,其中有一條就是“通過簡單名稱引用的變量可以出現(xiàn)在左值位置,但不能出現(xiàn)在右值的位置”,所以前面的代碼可以,但System.out.println(staticStr);不行,因?yàn)檫@是一個(gè)右值引用。
最后再簡單提一下什么是循環(huán)引用,看一下下面這個(gè)例子:
privateinti=j;
privateintj=i;
如果沒有前面說的強(qiáng)制檢查,那么這兩句代碼就會通過編譯,但是很容易就能看得出來,i和j并沒有被真正賦值,因?yàn)閮蓚€(gè)變量都是未初始化的(Java規(guī)定所有變量在使用之前必須被初始化),而這個(gè)就是最簡單的循環(huán)引用的例子。
                            
查看完整回答
反對 回復(fù) 2019-05-22
  • 2 回答
  • 0 關(guān)注
  • 1100 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號