構(gòu)造函數(shù)
- 構(gòu)造函數(shù)的作用
調(diào)用
public static void main(String[] args) {
new Demo("Test",18);
}
class Demo{
public String name;
public int age;
public Demo(){
構(gòu)造函數(shù)沒有返回值
方法名與類名相同
}
對(duì)類對(duì)象進(jìn)行初始化,允許以重載的形式存在多個(gè)構(gòu)造函數(shù)
public Demo(String name,int age){
this.name = name;
this.age = age;
System.out.println(this.name+"\r\n"+this.age);
}
}
如果一個(gè)類沒有顯式的聲明構(gòu)造函數(shù)何缓,Java編譯器在編譯時(shí)會(huì)自動(dòng)添加一個(gè)無參的構(gòu)造函數(shù)肢础,當(dāng)顯式聲明了構(gòu)造函數(shù),將不會(huì)自動(dòng)添加碌廓。
為什么一定要有這個(gè)構(gòu)造函數(shù)传轰?
因?yàn)槌蓡T變量的初始化都是通過調(diào)用構(gòu)造函數(shù)完成(類加載的準(zhǔn)備階段)。添加的構(gòu)造函數(shù)谷婆,其權(quán)限修飾符與類的權(quán)限修飾符是一致的慨蛙。
如果當(dāng)前類的權(quán)限修飾符為private class,那么這個(gè)構(gòu)造方法的權(quán)限修飾符就是private纪挎,同理期贫,如果是public class,構(gòu)造方法的權(quán)限修飾符即為public廷区。
構(gòu)造代碼塊
- 構(gòu)造代碼塊的作用
class Demo{
public String name;
public int age;
public static int count;
其實(shí)構(gòu)造代碼塊中的代碼也是在構(gòu)造函數(shù)中執(zhí)行唯灵。
.class文件經(jīng)過Java編譯器編譯后,構(gòu)造代碼塊中的代碼會(huì)被移動(dòng)到構(gòu)造函數(shù)中隙轻,
放置在構(gòu)造函數(shù)中代碼的最前端埠帕,
{
this.name = "Test";
this.age = 18;
System.out.println("只執(zhí)行一次" + count);
}
靜態(tài)代碼塊是在.class文件加載到內(nèi)存時(shí)就馬上執(zhí)行,不需要等到創(chuàng)建對(duì)象
由于類只加載一次玖绿,因此靜態(tài)代碼塊只執(zhí)行一次敛瓷。
static{
count++;
System.out.println("只執(zhí)行一次" + count);
}
public void test(){
{
//局部代碼塊:縮短局部變量的生命周期,節(jié)省一點(diǎn)點(diǎn)內(nèi)存斑匪,其實(shí)沒什么作用
System.out.println(name+"\r\n"+age);
}
}
}
- 補(bǔ)充
class Demo {
{
i = 18;
}
Java編譯器在編譯時(shí)呐籽,會(huì)把成員變量的聲明語句提前至一個(gè)類的最前端。
注意蚀瘸,提到最前端的只是聲明(private int i)狡蝶,實(shí)際的賦值還是按調(diào)用順序。
public int i = 19;
public void test() {
System.out.println(i + "輸出19");
}
}