26.final 類型成員變量賦初值方式
a).在聲明final類型的成員變量時(shí)賦初值
b).在聲明final類型的成員變量時(shí)不賦初值,但在類的所有構(gòu)造方法中都為其賦初值赌蔑。
public class FinalTest4
{
final int a;//無(wú)法編譯缀旁。未賦初值鸳谜。
}
public class FinalTest4
{
final int a;//可編譯本刽。雖然聲明final類型的成員變量時(shí)未賦值挪蹭,但在類的構(gòu)造方法中賦值亭饵。注意:需要在類的所有構(gòu)造方法中為其賦初值。
public FinalTest4()
{
a = 0;
}
public FinalTest4(int a)
{
this.a = a;
}
}
27.static代碼塊:靜態(tài)代碼塊梁厉,也是完成一些初始化工作辜羊。
首先執(zhí)行靜態(tài)代碼塊,再執(zhí)行構(gòu)造方法:靜態(tài)代碼塊在類被加載時(shí)執(zhí)行,而構(gòu)造方法是在生成對(duì)象時(shí)執(zhí)行八秃。要想調(diào)用某個(gè)類來(lái)生成對(duì)象碱妆,首先需要將類加載到Java虛擬機(jī)上(JVM),然后由JVM加載這個(gè)類來(lái)生成對(duì)象昔驱。
28.類的靜態(tài)代碼塊只會(huì)執(zhí)行一次:在類被加載時(shí)執(zhí)行疹尾,而每個(gè)類只會(huì)被加載一次。
而構(gòu)造方法則不然:在每生成一個(gè)對(duì)象時(shí)都調(diào)用類的構(gòu)造方法骤肛,所有new一次就會(huì)調(diào)用一次構(gòu)造方法航棱。
public class StaticTest4
{
public static void main(String[] args)
{
new S();//首先執(zhí)行靜態(tài)代碼塊,再執(zhí)行構(gòu)造方法萌衬。
new S();//類的靜態(tài)代碼塊只會(huì)執(zhí)行一次饮醇,而構(gòu)造方法在每生成一個(gè)對(duì)象時(shí)都調(diào)用類的構(gòu)造方法。
}
}
class P
{
public P()
{
System.out.println("P constructor");
}
static
{
System.out.println("P static block");
}
}
class Q extends P
{
public Q()
{
System.out.println("Q constructor");
}
static
{
System.out.println("Q static block");
}
}
class S extends Q
{
public S()
{
System.out.println("S constructor");
}
static
{
System.out.println("S static block");
}
}
29.不能在靜態(tài)方法中訪問(wèn)非靜態(tài)成員變量秕豫;可以在靜態(tài)方法中訪問(wèn)靜態(tài)的成員變量朴艰;可以在非靜態(tài)方法中訪問(wèn)靜態(tài)的成員變量。
總結(jié):靜態(tài)的可訪問(wèn)靜態(tài)的混移,非靜態(tài)的可訪問(wèn)一切祠墅。
不能在靜態(tài)方法中訪問(wèn)this關(guān)鍵字。
public class StaticTest5
{
public static void main(String[] args)
{
W.change();
}
}
class W
{
int a = 10;
public static void change()
{
a++;
}
}
public class StaticTest5
{
public static void main(String[] args)
{
W w = new W();
W.change();
}
}
class W
{
static int a = 10;
public static void change()
{
this.a++;//不能在靜態(tài)方法中使用this關(guān)鍵字歌径。
}
}