為什麼this super不能用在static方法中??
阿新 • • 發佈:2019-01-03
class Fu
{
int a;
}
class Zi extends Fu
{
int b;
static void test(){
this.b;
super.a;
}
}
編譯報錯:Cannot use this in a static context Cannot use super in a static context
解釋:
因為static方法和類的例項(物件)是兩碼事,它只在類裝載的時候(即編譯的時候或者javac命令的時候)初始化,被稱作類級變數(屬於類);而類的例項是在程式執行的時候(即Java命令的時候)初始化,被稱作物件級變數(屬於物件);
this表示這個類的當前例項,super表示父類的當前例項,static是屬於類的,this是類的一個物件,當然呼叫了不了他,static太牛了,只有類名可以呼叫它,static叫靜態方法,也叫類方法,就是在程式啟動的時候,就會為這個方法分配一塊記憶體空間,所以什麼時候都可以呼叫這個方法。所以,靜態方法裡不能呼叫非靜態方法,除非你先例項化那個類。如果在static修飾的方法中使用this關鍵字,而這個關鍵字就無法指向合適的物件;所以我們也說,靜態成員不能直接訪問非靜態成員;jvm有類載入器,第一次載入類時執行類中的static域,jvm會專門劃分一個記憶體區域給static程式塊,可以成為靜態區,屬於這個類。this指標是指向類的物件,在例項化物件時jvm會在堆區分配記憶體給一個具體的物件,this指標指向這個物件。而類中的static域始終是在靜態區分配記憶體,this指向堆區,所以不能呼叫。static是屬於類的。this是物件指標