Java之類(lèi)的成員

類(lèi)的成員包括屬性和方法钝凶,也稱(chēng)作成員變量和成員方法娜庇。

1.成員方法

1.1.方法重載

方法重載是OOP中的一個(gè)重要概念炫贤,而實(shí)際開(kāi)發(fā)中經(jīng)常用的方法重載。

1.1.1.方法重載的定義

方法重載是指在一個(gè)類(lèi)中定義多個(gè)同名的方法尔邓,但要求每個(gè)方法具有不同的參數(shù)類(lèi)型或參數(shù)個(gè)數(shù)或參數(shù)順序晾剖。即:在同一個(gè)類(lèi)中,同名不同參梯嗽,與返回值無(wú)關(guān)齿尽。

public class Student{
    public void play(){
        
    }
    public int play(int time){
        return 0;
    }
}

1.1.2.方法重載的調(diào)用

方法重載在調(diào)用時(shí),根據(jù)實(shí)參與形參在類(lèi)型灯节、個(gè)數(shù)循头、順序一一匹配的規(guī)則調(diào)用。即:方法重載根據(jù)參數(shù)匹配原則進(jìn)行調(diào)用炎疆。

public class Student{
    public void play(){
        System.out.println("方法一");
    }
    public int play(int time){
        System.out.println("方法二");
        return 0;
    }

    public static void main(String[] args) {
        Student s1 = new  Student();
        s1.play();    //調(diào)用的是第一個(gè)方法
        Student s2 = new  Student();
        s2.play(1);  //調(diào)用的是第二個(gè)方法
    }
}

運(yùn)行結(jié)果:

方法一
方法二

2.什么是構(gòu)造方法

2.1.什么是構(gòu)造方法

構(gòu)造方法也叫構(gòu)造函數(shù)卡骂,或者叫構(gòu)造器

在java中,當(dāng)類(lèi)創(chuàng)建一個(gè)對(duì)象時(shí)會(huì)自動(dòng)調(diào)用該類(lèi)的構(gòu)造方法形入,構(gòu)造方法分為默認(rèn)構(gòu)造方法和自定義的構(gòu)造方法全跨。
構(gòu)造方法的語(yǔ)法格式:

[訪(fǎng)問(wèn)修飾符] 方法名([參數(shù)列表]){
         //方法體的代碼
}

特點(diǎn):
1.構(gòu)造方法的方法名必須與類(lèi)名相同
2.構(gòu)造方法沒(méi)有返回值,也不寫(xiě)void
示例:

public class Student {
    //構(gòu)造方法
    Student(){

    }
}

注意:下面這個(gè)方法是構(gòu)造方法嗎?

public class Student {
    void Student(){//普通方法亿遂,可有對(duì)象調(diào)用

    }
    void play(){
        
    }
}

答:不是螟蒸,第2行的Student()方法前面添加了void,因此不是構(gòu)造方法崩掘,此時(shí)它是一個(gè)普通的方法。與play方法一樣少办“可以使用實(shí)例化后對(duì)象調(diào)用Student()方法。

不推薦把普通方法名稱(chēng)定義為與類(lèi)名相同英妓。

2.2.構(gòu)造方法的作用

構(gòu)造方法的作用為成員變量初始化(為對(duì)象的屬性初始化)挽放。

2.2.1.默認(rèn)構(gòu)造函數(shù)

一個(gè)類(lèi)如果沒(méi)有顯示的定義構(gòu)造函數(shù)绍赛,那么這個(gè)類(lèi)默認(rèn)具有無(wú)參的構(gòu)造函數(shù)。
默認(rèn)構(gòu)造函數(shù)為對(duì)象的屬性賦默認(rèn)值辑畦。

class Student {
    String name;
    int score;
    String no;
    public void play(){
        System.out.printf("我的名字是%s,我的成績(jī)是%d,我的學(xué)號(hào)是%s",this.name,this.score,this.no);
    }
}
public class StudentTest {
    public static void main(String[] args) {
        Student s1 =new Student();
        s1.play();
    }
}

運(yùn)行結(jié)果:

我的名字是null,我的成績(jī)是0,我的學(xué)號(hào)是null

為什么輸出的是null,0,null吗蚌?
分析:因?yàn)楸纠袥](méi)有定義構(gòu)造函數(shù),系統(tǒng)會(huì)自動(dòng)添加一個(gè)默認(rèn)構(gòu)造函數(shù)纯出,默認(rèn)構(gòu)造函數(shù)是無(wú)參的蚯妇,會(huì)為所有的屬性賦默認(rèn)值,因此name是null暂筝,score是0箩言,no是null。

2.2.2.自定義的構(gòu)造函數(shù)

如果顯示的定義了構(gòu)造函數(shù)焕襟,那么默認(rèn)構(gòu)造函數(shù)就沒(méi)有啦陨收。

class Student {
    String name;
    int score;
    String no;
    //顯示定義構(gòu)造函數(shù),此時(shí)默認(rèn)構(gòu)造函數(shù)就沒(méi)有了
    Student(){
        
    }
}

2.3.構(gòu)造方法的調(diào)用

構(gòu)造方法是在實(shí)例化對(duì)象時(shí)調(diào)用的鸵赖。并且實(shí)例化時(shí)傳遞的參數(shù)必須有構(gòu)造方法的參數(shù)一致务漩。

class Student {
    String name;
    int score;
    String no;

    /**
     * 有兩個(gè)參數(shù)的構(gòu)造方法
     * @param name1
     * @param score1
     */
    Student(String name1,int score1){
        name= name1;
        score= score1;
    }
}
public class StudentTest {
    public static void main(String[] args) {
        Student s1 =new Student("haha",76);//調(diào)用student類(lèi)的構(gòu)造方法,為name和score屬性初始化它褪,no為默認(rèn)值null
    }
}

構(gòu)造方法不允許通過(guò)對(duì)象名調(diào)用饵骨。例如下面的調(diào)用是錯(cuò)誤的:

 public static void main(String[] args) {
    Student s1 =new Student("haha",76);
    s1.Student("haha",88);//錯(cuò)誤的,對(duì)象名不允許調(diào)用構(gòu)造函數(shù)  
}

2.4.構(gòu)造方法的重載

class Student {
    String name;
    int score;
    String no;

    //第1種構(gòu)造方法的重載
    Student(String name1,int score1){
        name= name1;
        score= score1;
    }
    //第2種構(gòu)造方法的重載
    Student(String name1, int score1, String no1) {
        name = name1;
        score = score1;
        no = no1;
    }
}
public class StudentTest {
    public static void main(String[] args) {
        Student s1 =new Student("haha",76);//調(diào)用第1種構(gòu)造方法的重載
        Student s2 =new Student("yaya",67,"111");//調(diào)用第2種構(gòu)造方法的重載
    }
}

采坑:

這個(gè)實(shí)例化為什么報(bào)錯(cuò)?

class Student {
    String name;
    int score;
    String no;
}
public class StudentTest {
    public static void main(String[] args) {
        Student s1 = new Student("haha",76); //報(bào)錯(cuò)列赎,為什么宏悦?
    }
}

分析:因?yàn)閚ew 類(lèi)時(shí)必須調(diào)用構(gòu)造方法,而第8行有兩個(gè)參數(shù)haha和76包吝,因此會(huì)調(diào)用有兩個(gè)參數(shù)的構(gòu)造饼煞,但是類(lèi)中沒(méi)有定義有兩個(gè)參數(shù)的構(gòu)造,因此報(bào)錯(cuò)诗越。

3.this關(guān)鍵字

this關(guān)鍵字是對(duì)一個(gè)對(duì)象的默認(rèn)引用砖瞧,即:this代表的是當(dāng)前正在運(yùn)行的對(duì)象。

class Student {
    String name;
    int score;
    String no;
    Student(String name,int score){
        name= name;  
        score= score; 
    }
    public void sayHello(){
        System.out.printf("我是%s,我的成績(jī)是%d嚷狞,我的學(xué)號(hào)是%s",name,score,no);
    }
}
public class StudentTest {
    public static void main(String[] args) {
        Student s1 = new Student("haha",76);
        s1.sayHello();
    }
}

運(yùn)行結(jié)果:

我是null,我的成績(jī)是0块促,我的學(xué)號(hào)是null

分析原因:為什么是null,0床未,null?
看構(gòu)造函數(shù)

Student(String name,int score){
    name= name;   //name的值賦給了name竭翠,前面的name是誰(shuí)?后面的name是誰(shuí)薇搁?前后的name都是方法參數(shù)name
    score= score; //score的值賦給了score斋扰,前面的score是誰(shuí)?后面的score是誰(shuí)?前后的score都是方法參數(shù)score
}

原因是
1.前后的name都是方法參數(shù)name
2.前后的score都是方法參數(shù)score

在類(lèi)中传货,如果類(lèi)的屬性名和方法內(nèi)部的局部變量同名時(shí)屎鳍,那么在方法內(nèi)部使用的是局部變量,也就是變量使用遵循就近原則问裕。

解決方法:

    String name;
    int score;
    String no;
    Student(String name,int score){
        //this代表正在運(yùn)行的對(duì)象逮壁,當(dāng)執(zhí)行第16行代碼時(shí),調(diào)用了構(gòu)造函數(shù)粮宛,此時(shí)this代表第16行的s1
        this.name= name;   //this.name指的是對(duì)象的屬性窥淆,name是指方法的參數(shù)。
        this.score= score; //this.score指的是對(duì)象的屬性窟勃,score是指方法的參數(shù)祖乳。
    }
    public void sayHello(){
        System.out.printf("我是%s,我的成績(jī)是%d,我的學(xué)號(hào)是%s",this.name,this.score,this.no);
    }
}
public class StudentTest {
    public static void main(String[] args) {
        Student s1 = new Student("haha",76);
        s1.sayHello();
    }
}

運(yùn)行結(jié)果:

我是haha,我的成績(jī)是76秉氧,我的學(xué)號(hào)是null

3.1.什么時(shí)候可以省略this

在非static方法內(nèi)部使用屬性眷昆,可以省略。

public void sayHello(){
    System.out.printf("我是%s,我的成績(jī)是%d汁咏,我的學(xué)號(hào)是%s",this.name,this.score,this.no);
}
public void sayHello(){
    System.out.printf("我是%s,我的成績(jī)是%d亚斋,我的學(xué)號(hào)是%s",name,score,no);
}

兩種結(jié)果相同

4.成員變量

成員變量是類(lèi)的屬性,直接定義在類(lèi)內(nèi)攘滩,方法的外部的變量帅刊。
例如:

class Student {
    String name;
    int score;
    String no;
}

4.局部變量

局部變量是定義在方法內(nèi)的變量
例如:

    public void sayHello(){
        int height = 20;//局部變量
    }

成員變量和局部變量的區(qū)別

  • 作用域不同

    • 成員變量作用域:整個(gè)類(lèi)
    • 局部變量的作用域:方法內(nèi)
  • 初始值不同

    • 成員變量由構(gòu)造函數(shù)初始化的
    • 局部變量需要手動(dòng)初始化
  • 在同一個(gè)方法中不允許有同名的局部變量,在不同的方法中可以有同名的局部變量漂问。

  • 局部變量可以和成員變量名相同赖瞒,并且在使用時(shí)局部變量有更高的優(yōu)先級(jí)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蚤假,一起剝皮案震驚了整個(gè)濱河市栏饮,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌磷仰,老刑警劉巖袍嬉,帶你破解...
    沈念sama閱讀 206,602評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異灶平,居然都是意外死亡伺通,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)逢享,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)罐监,“玉大人,你說(shuō)我怎么就攤上這事瞒爬⌒ψ纾” “怎么了调缨?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,878評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀(guān)的道長(zhǎng)吆你。 經(jīng)常有香客問(wèn)我,道長(zhǎng)俊犯,這世上最難降的妖魔是什么妇多? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,306評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮燕侠,結(jié)果婚禮上者祖,老公的妹妹穿的比我還像新娘。我一直安慰自己绢彤,他們只是感情好七问,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,330評(píng)論 5 373
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著茫舶,像睡著了一般械巡。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上饶氏,一...
    開(kāi)封第一講書(shū)人閱讀 49,071評(píng)論 1 285
  • 那天讥耗,我揣著相機(jī)與錄音,去河邊找鬼疹启。 笑死古程,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的喊崖。 我是一名探鬼主播挣磨,決...
    沈念sama閱讀 38,382評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼荤懂!你這毒婦竟也來(lái)了茁裙?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,006評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤势誊,失蹤者是張志新(化名)和其女友劉穎呜达,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體粟耻,經(jīng)...
    沈念sama閱讀 43,512評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡查近,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,965評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了挤忙。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片霜威。...
    茶點(diǎn)故事閱讀 38,094評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖册烈,靈堂內(nèi)的尸體忽然破棺而出戈泼,到底是詐尸還是另有隱情婿禽,我是刑警寧澤,帶...
    沈念sama閱讀 33,732評(píng)論 4 323
  • 正文 年R本政府宣布大猛,位于F島的核電站扭倾,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏挽绩。R本人自食惡果不足惜膛壹,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,283評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望唉堪。 院中可真熱鬧模聋,春花似錦、人聲如沸唠亚。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,286評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)灶搜。三九已至祟蚀,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間占调,已是汗流浹背暂题。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,512評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留究珊,地道東北人薪者。 一個(gè)月前我還...
    沈念sama閱讀 45,536評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像剿涮,于是被迫代替她去往敵國(guó)和親言津。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,828評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容