Java基礎(chǔ) --- 構(gòu)造函數(shù)

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

構(gòu)造函數(shù)內(nèi)存圖解

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)用多次。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容