1 概述
1-1 為什么會(huì)出現(xiàn)構(gòu)造函數(shù)(作用)
對(duì)象不初始化,沒(méi)辦法使用,構(gòu)造函數(shù)的作用,就是
給對(duì)象進(jìn)行初始化
1-2 什么是構(gòu)造函數(shù)
構(gòu)造函數(shù),就是 構(gòu)建 創(chuàng)造 對(duì)象 時(shí),對(duì)對(duì)象,進(jìn)行創(chuàng)建的函數(shù)
1-3 構(gòu)造函數(shù)的特點(diǎn)
- 函數(shù)名與類名相同
- 不用定義返回值類型
- 沒(méi)有具體返回值類型
2 默認(rèn)構(gòu)造函數(shù)
class Demo{
Demo() {}; // 默認(rèn)構(gòu)造函數(shù)
// 這個(gè)和默認(rèn)構(gòu)造函數(shù)是同一個(gè)函數(shù)
// 函數(shù)只關(guān)注,返回值是什么,函數(shù)名是什么,參數(shù)是什么
Demo(){
System.out.println("默認(rèn)構(gòu)造函數(shù)");
}
}
- 創(chuàng)建對(duì)象,都必須要通過(guò)構(gòu)造函數(shù),進(jìn)行初始化
- 一個(gè)類中,如果沒(méi)有定義過(guò)構(gòu)造函數(shù),那么該類,會(huì)有一個(gè)默認(rèn)的空參構(gòu)造函數(shù)
- 如果在類中定義了指定的構(gòu)造函數(shù),那么類中默認(rèn)的構(gòu)造函數(shù)就沒(méi)有了,上面代碼中,執(zhí)行第二個(gè)構(gòu)造函數(shù),第一個(gè)不再執(zhí)行
3 構(gòu)造函數(shù)的重載
函數(shù)的重載:方法名相同,參數(shù)的個(gè)數(shù)/類型 不同
什么時(shí)候定義構(gòu)造函數(shù) ?
: 在描述對(duì)象時(shí),該對(duì)象一存在,就具備一些屬性,這些屬性可以定義在構(gòu)造函數(shù)中
構(gòu)造函數(shù)可以有多個(gè),用于對(duì)不同的對(duì)象,進(jìn)行針對(duì)性的初始化
class Person
{
private String name;
private int age;
//定義一個(gè)Person類的構(gòu)造函數(shù)。
Person()//構(gòu)造函數(shù),而且是空參數(shù)的。
{
name = "baby";
age = 1;
System.out.println("person run");
}
//如果有的孩子一出生就有名字。
Person(String n)
{
this.name = n;
}
Person(String n,int a)
{
this.name = n;
this.age = a;
}
public void setName(String n)
{
this.name = n;
}
public void speak()
{
System.out.println(name+":"+age);
}
}
4 構(gòu)造函數(shù)內(nèi)存細(xì)節(jié)
class Person{
...
Person(String n,int a)
{
this.name = n;
this.age = a;
}
...
}
main(){
Person p2 = new Person("小強(qiáng)",10);
p2.speak();
}
對(duì)象的初始化,分為兩個(gè)部分
1 默認(rèn)初始化,name = null; age =0;
2 構(gòu)造函數(shù)初始化,通過(guò)構(gòu)造函數(shù),給對(duì)象分別初始化名字 name="小強(qiáng)",age="10";
對(duì)象初始化過(guò)程:
// Person p2 = new Person("小強(qiáng)",10);
1 new Person("小強(qiáng)",10); 默認(rèn)初始化,name = null; age =0;
初始化完后,并沒(méi)有馬上把地址給 p,因?yàn)闃?gòu)造函數(shù)還沒(méi)初始化
2 new Person("小強(qiáng)",10);調(diào)用構(gòu)造函數(shù)Person(String n,int a){},構(gòu)造函數(shù)進(jìn)棧,進(jìn)棧后給 name, age 賦值。
3 棧中沒(méi)有 name, age,去堆中尋找,堆中可能有很多對(duì)象,都有name,age,怎么確定把這個(gè) name, age 賦給誰(shuí)? 通過(guò) this, 確定對(duì)象。執(zhí)行完后,構(gòu)造函數(shù)出棧,被釋放
4 把地址賦給 p2

5 構(gòu)造函數(shù)細(xì)節(jié)
1 構(gòu)造函數(shù)如果完成了 set功能,set()方法是否還需要 --- 需要
構(gòu)造函數(shù)是給對(duì)象設(shè)置默認(rèn)的名字,如果我們對(duì)默認(rèn)的名字不滿意,可以通過(guò) set()方法進(jìn)行修改。
Person p1 = new Person("旺財(cái)");
p1.setName("旺旺");
//如果有的孩子一出生就有名字。
Person(String n) // 構(gòu)造函數(shù)
{
this.name = n;
}
public void setName(String n) // 一般方法
{
this.name = n;
}
2 一般函數(shù)不能直接調(diào)用構(gòu)造函數(shù)
構(gòu)造函數(shù)是
給對(duì)象初始化的,一般函數(shù)想調(diào)用構(gòu)造函數(shù),需要先創(chuàng)建對(duì)象,這樣代碼不規(guī)劃,太麻煩,沒(méi)這個(gè)必要
3 構(gòu)造函數(shù)如果前面加上 void 就變成了一般函數(shù)
這是新人容易犯的錯(cuò)誤,比如
Person(){}, 寫成 void Person(){}
記住構(gòu)造函數(shù)的三大特征之一,構(gòu)造函數(shù) 函數(shù)名與類名相同
4 任何函數(shù)都有 return語(yǔ)句,構(gòu)造函數(shù)也不例外
return 是結(jié)束函數(shù)用的,構(gòu)造函數(shù)很少寫 return語(yǔ)句
因?yàn)?當(dāng) new 對(duì)象 的時(shí)候,對(duì)象里面?zhèn)鞯闹?,都?lái)自客戶,這基本上都是有一個(gè)校驗(yàn)的。
Person( String n, int a ){
if(a<0)
return; // 如果胡亂傳值,就不讓初始化
name = n;
age = a
}
6 構(gòu)造函數(shù)與一般函數(shù)的區(qū)別
構(gòu)造函數(shù)的3大特征,是與一般函數(shù)的最大區(qū)別
--- 對(duì)象創(chuàng)建時(shí),Person p = new Person();
構(gòu)造函數(shù):對(duì)象創(chuàng)建時(shí),就會(huì)調(diào)用與之對(duì)應(yīng)的構(gòu)造函數(shù),對(duì) 對(duì)象進(jìn)行初始化。
一般函數(shù):對(duì)象創(chuàng)建后,需要函數(shù)功能時(shí)才調(diào)用。
構(gòu)造函數(shù):對(duì)象創(chuàng)建時(shí),會(huì)調(diào)用只調(diào)用一次。 一個(gè)對(duì)象只調(diào)用一次,再調(diào)用,是新對(duì)象調(diào)用
一般函數(shù):對(duì)象創(chuàng)建后,可以被調(diào)用多次。