1.7構(gòu)造方法的講解
關(guān)于java類的構(gòu)造方法
意義就是通過定義一個(gè)構(gòu)造方法赛不,使得其所在的類能夠在主程序中隨時(shí)創(chuàng)建一個(gè)位于堆內(nèi)存的這個(gè)函數(shù)就對(duì)象,
這樣的話浪耘,只要new能創(chuàng)建一個(gè)對(duì)象隨時(shí)訪問乱灵。
1、構(gòu)造方法又被稱為構(gòu)造函數(shù)/構(gòu)造器/constructor
2七冲、構(gòu)造方法語(yǔ)法結(jié)構(gòu):
[修飾符列表]構(gòu)造方法名(形式參數(shù)列表)
{
構(gòu)造方法體痛倚;
}
3、回顧普通方法的語(yǔ)法結(jié)構(gòu):
[修飾符列表]構(gòu)造方法名(形式參數(shù)列表)
{
方法體澜躺;
}
4蝉稳、對(duì)于構(gòu)造方法來說“返回值類型”不需要指定,并且也不能寫void掘鄙,
只要寫上void耘戚,那么這個(gè)方法就成為了普通方法。
5操漠、對(duì)于構(gòu)造方法來說收津,構(gòu)造方法的方法名和類名保持一致。
6浊伙、構(gòu)造方法的作用:
構(gòu)造方法存在的意義是撞秋,通過構(gòu)造方法的調(diào)用,可以創(chuàng)建對(duì)象嚣鄙。
7吻贿、構(gòu)造方法應(yīng)該怎么調(diào)用?
普通方法是這樣調(diào)用的:方法修飾符中有static的時(shí)候:類名:方法名(實(shí)參列表)哑子,方法修飾符列表中沒有static的時(shí)候:引用.方法名(實(shí)參列表)
構(gòu)造方法調(diào)用的方式:new構(gòu)造方法名()
8舅列、構(gòu)造·方法調(diào)用執(zhí)行之后有返回值嗎?
每一個(gè)構(gòu)造方法實(shí)際執(zhí)行結(jié)束之后都有返回值卧蜓,但是這個(gè)return值帐要;這樣的語(yǔ)句不需要寫,構(gòu)造方法結(jié)束的時(shí)候java程序自動(dòng)返回值烦却。
并且返回值類型是構(gòu)造方法所在類的類型宠叼,由于構(gòu)造方法的返回值類型是類本身,所以返回值類型不需要編寫。
9冒冬、myeclipse注釋和取消注釋快捷鍵ctrl+/,多行注釋ctrl+shift+/;
10伸蚯、當(dāng)一個(gè)類中沒有定義任何構(gòu)造方法的話,系統(tǒng)默認(rèn)給該類提供一個(gè)無(wú)參數(shù)構(gòu)造方法简烤,這個(gè)構(gòu)造方法被稱為缺省構(gòu)造器剂邮。
11、當(dāng)一個(gè)類顯示的將構(gòu)造方法定義出來了横侦,那么系統(tǒng)則不再默認(rèn)為這個(gè)類提供缺省構(gòu)造器挥萌,建議開發(fā)中手動(dòng)的為當(dāng)前類提供無(wú)參數(shù)構(gòu)造方法,因此無(wú)參數(shù)構(gòu)造方法太常用了枉侧。
12引瀑、構(gòu)造方法支持重載機(jī)制,在一個(gè)類當(dāng)中編寫多個(gè)方法榨馁,這多個(gè)構(gòu)造方法顯然已經(jīng)構(gòu)成方法重載機(jī)制憨栽。(即通過不同類型的實(shí)參,調(diào)用同一個(gè)方法實(shí)現(xiàn)不同功能)
public class User()
{
public User(int i)//1
{
}
}
public class ConstructorTest
{
public static void main(String[]args)
{
//創(chuàng)建User對(duì)象
//調(diào)用User類的構(gòu)造方法來完成對(duì)象的創(chuàng)建
User u=new user()
}
}
如果1處注釋掉翼虫,則情況就是第十個(gè)情況系統(tǒng)會(huì)給給這個(gè)類提供一個(gè)無(wú)參數(shù)構(gòu)造方法
如果1處不注釋掉屑柔,則會(huì)報(bào)錯(cuò),因?yàn)閡ser()與user(int i)不同珍剑,因此報(bào)錯(cuò)會(huì)提示沒有定義user()掸宛。
public class User()
{
public User()//1
{
System.out,println("user's Default Constructor Invoke!")招拙;
}
public User(int i)//1
{
System.out,println("int")唧瘾;
}
public User(string i)//1
{
System.out,println("string");
}
public User(int i迫像,string j)//1
{
System.out,println("int劈愚,string");
}
}
public class ConstructorTest
{
public static void main(String[]args)
{
//創(chuàng)建User對(duì)象
//調(diào)用User類的構(gòu)造方法來完成對(duì)象的創(chuàng)建
//以下程序創(chuàng)建了4個(gè)對(duì)象闻妓,只要構(gòu)造函數(shù)調(diào)用就會(huì)創(chuàng)建對(duì)象,并且一定是在“堆內(nèi)存”中開辟內(nèi)存空間掠械。
User u=new user()由缆;//user()實(shí)際上是構(gòu)造方法的方法名。
User u=new user(10)猾蒂;
User u=new user(“張三”)均唉;
User u=new user(10,“張三”)肚菠;//方法的重載
//調(diào)用static的方法:類名.
ConstructorTest.dosome()舔箭;//執(zhí)行一遍dosome
dosme();//類內(nèi)方法的調(diào)用,再次執(zhí)行一遍dosome
//調(diào)用沒有static的方法:引用.
//doOther方法在ConstructorTest對(duì)象,調(diào)用無(wú)參數(shù)構(gòu)造方法层扶。
//創(chuàng)建ConstructorTest01對(duì)象箫章,調(diào)用無(wú)參數(shù)構(gòu)造方法。
ConstructorTest t=new ConstructorTest()镜会;//一個(gè)類中沒有任何構(gòu)造方法的話檬寂,系統(tǒng)默認(rèn)提供一個(gè)無(wú)參數(shù)構(gòu)造器。
t.doother()戳表;
}
/**
*這是一個(gè)帶有static的方法桶至,方法名dosome
*/這個(gè)注釋將會(huì)被放在系統(tǒng)的dosome解釋中
public static void dosome()
{
System.out,println("dosome");
}
public? void doother()
{
System.out,println("doother")匾旭;
}
}
構(gòu)造方法的另一個(gè)作用镣屹;
1、創(chuàng)建對(duì)象
2价涝、創(chuàng)建對(duì)象的同時(shí)女蜈,初始化實(shí)例變量的內(nèi)存空間。成員變量之實(shí)例變量沒有手動(dòng)賦值的時(shí)候飒泻,系統(tǒng)默認(rèn)賦值鞭光,南無(wú)這個(gè)系統(tǒng)默認(rèn)賦值是在什么時(shí)候完成的呢?
不是泞遗,因?yàn)樵陬惣虞d的時(shí)候只加載代碼片段惰许,還沒來得及創(chuàng)建對(duì)象。所以此時(shí)實(shí)例變量都沒有初始化史辙。
實(shí)際上汹买,實(shí)測(cè)變量的內(nèi)存空間是在構(gòu)造方法執(zhí)行過程當(dāng)中完成開辟的。完成初始化的聊倔。
系統(tǒng)在默認(rèn)賦值的時(shí)候晦毙,也是在構(gòu)造方法過程當(dāng)中完成的賦值。
實(shí)例變量默認(rèn)值:
int short byte long 0
float double 0.0
boolean false true
實(shí)例變量是存儲(chǔ)在jvm堆內(nèi)存中
public class Account
{
private String actno;//賦初值null
private double balance;
}
public class ConstructorTest
{
public static void main(String[]args)
{
//在eclipse中查看訪問的是哪個(gè)屬性耙蔑,查看訪問的是哪個(gè)方法见妒?
//按ctrl鍵,鼠標(biāo)移動(dòng)到查看的元素上甸陌;出現(xiàn)下劃線時(shí)候開始單擊须揣。
//創(chuàng)建對(duì)象
Account act1=new Account();
System.out,println("賬號(hào)"+)钱豁;
}
}
ctrl+o:查看類中的元素
mydeclipse快速編輯支持多行同時(shí)編輯:塊編輯
封裝:屬性私有化耻卡,set和get
對(duì)象和引用
引用:可以是局部變量也可以是成員變量。
public class Test
{
public static void main(String[]args)
{
int i=10牲尺;
add(i)卵酪;
System.out,println("main-->"+i);//10
}
public static void add(int i)
{
i++;
System.out,println("add-->"+i);//11
}
}
因?yàn)楫?dāng)方法調(diào)用完i后并不會(huì)返回i的值溃卡,因此i會(huì)恢復(fù)原來的值溢豆。
從內(nèi)存的角度來說是main中的i內(nèi)存地址中的10復(fù)制了之后給了add方法中,讓add進(jìn)行操作塑煎,這并不會(huì)影響main中i的值沫换。因此,參數(shù)傳遞時(shí)最铁,實(shí)際上傳遞的是參數(shù)值而非地址讯赏。
public class Test
{
public static void main(String[]args)
{
user u=new User(20);
add(u)冷尉;
System.out,println("main-->"+u.age)漱挎;//21
}
public static void add(int i)
{
u.age++;
System.out,println("add-->"+u.age);//21
}
}
class User
{
int age;
public User(int i)
{
age=i
}
}
這里體現(xiàn)出了變量和引用之間的區(qū)別雀哨,引用的自加是從被指向?qū)ο蟮恼鎸?shí)地址上進(jìn)行操作磕谅,因?yàn)橐弥斜4娴氖菍?duì)象的地址。因此可以做到即使函數(shù)結(jié)束改變的量依舊被改變
而變量賦值改變僅僅是將復(fù)制的值傳給函數(shù)雾棺,并未從實(shí)際意義上改變變量的值膊夹,也就是用完就丟棄,不會(huì)重新傳給變量捌浩。
方法調(diào)用的時(shí)候放刨,關(guān)于參數(shù)傳遞問題,傳遞的時(shí)候尸饺,java只遵循一種語(yǔ)法機(jī)制进统,就是將變量中保存的“值”傳遞過去了,只不過有的時(shí)候這個(gè)值是一個(gè)字面值10浪听,有的時(shí)候是另一個(gè)Java對(duì)象的內(nèi)存地址0x1234