類和對象

來自拉鉤教育-JAVA就業(yè)集訓(xùn)營

面向?qū)ο缶幊痰母拍?/h2>
  • 萬物皆對象。
  • 面向?qū)ο笾敢詫傩院托袨榈挠^點(diǎn)去分析現(xiàn)實(shí)生活中事務(wù)羞芍。
  • 面向?qū)ο缶幊讨赶纫悦嫦驅(qū)ο蟮乃枷脒M(jìn)行分析,然后使用面向?qū)ο蟮木幊陶Z言進(jìn)行表達(dá)的過程郊艘。
  • 面向?qū)ο缶幊淌擒浖a(chǎn)業(yè)化發(fā)展的需求荷科。
  • 理解面向?qū)ο蟮乃枷刖瑁ǚ盅b、繼承纱注、多態(tài))畏浆,至少掌握一種編程語言。

類和對象的概念

  • 對象主要指現(xiàn)實(shí)生活中客觀存在的實(shí)體狞贱,在Java語言中對象體現(xiàn)為內(nèi)存空間中的一塊存儲(chǔ)區(qū)域刻获。
  • 類簡單來就是“分類”,是對具有相同特征和行為的多個(gè)對象共性的抽象描述瞎嬉,在Java語言中體現(xiàn)為一種引用數(shù)據(jù)類型蝎毡,里面包含了描述特征/屬性的成員變量以及描述行為的成員方法厚柳。
  • 類時(shí)用于構(gòu)建對象的模板,對象的數(shù)據(jù)結(jié)構(gòu)由定義它的類來決定沐兵。

類的定義

    // class 類名 {
    //  類體;
    // }
    class Person {
        
    }
  • 注意:

通常情況下别垮,當(dāng)類名由多個(gè)單次組成時(shí),要求每個(gè)單次首字母都要大寫扎谎。

成員變量的定義

  • 語法:
    class 類名 {
        數(shù)據(jù)類型 成員變量名 = 初始值;
    }
  • 例子:
    class PerSon {
        String name;
    }
  • 注意:

當(dāng)成員變量由多個(gè)單詞組成時(shí)碳想,通常要求從第二個(gè)單詞起每個(gè)單詞的首字母大寫。

對象的創(chuàng)建

  • 語法:
    new 類名();
  • 列子:
    new person();
  • 注意:

a.當(dāng)一個(gè)類定義完畢后毁靶,可以使用new關(guān)鍵字來創(chuàng)建該類的對象胧奔,這個(gè)過程叫做類的實(shí)例化。
b.創(chuàng)建對象的本質(zhì)就是在內(nèi)存空間的堆區(qū)申請一塊存儲(chǔ)區(qū)域预吆,用于存放該對象獨(dú)有特征信息龙填。
創(chuàng)建出來的對象,但是又沒有名字的對象叫做匿名對象啡浊。

引用的定義

  • 基本概念:

a.使用引用數(shù)據(jù)類型定義的變量叫做引用類型變量觅够,簡稱為“引用”。
b.引用變量主要用于記錄對象在堆區(qū)中的內(nèi)存地址信息巷嚣,便于下次訪問喘先。

  • 語法格式

類名 引用變量名;
引用變量名.成員變量名;

  • 列子:
    Person p = new Persion();
    p.name = "張飛";
    System.out.println(p.name);

案列題目

  • 編程實(shí)現(xiàn)Person類的定義和使用
/*
    編程實(shí)現(xiàn)Person類的定義
*/
public class Person {
    
    // 數(shù)據(jù)類型 成員變量名 = 初始值;  - 其中 = 初始值廷粒,通常都省略不寫
    String name; // 用于描述姓名的成員變量
    int age; // 用于描述年齡的成員變量
    
    public static void main(String[] args) {
        
        // 1.聲明Person類型的引用執(zhí)行Person類型的對象
        // 數(shù)據(jù)類型(類名) 引用變量名 = new 類名();
        Person p = new Person();
        
        // 2.打印對象中的成員變量值
        // 引用變量名.成員變量名
        System.out.println("我是" + p.name + ", 今年" + p.age + "歲了"); // null 0
        
        System.out.println("-------------------------------------------");
        
        // 3.修改成員變量的數(shù)值
        p.name = "zhangfei";
        p.age = 30;
        // 4.再次打印修改后的數(shù)值
        System.out.println("我是" + p.name + ", 今年" + p.age + "歲了"); // zhangfei 30
        
    }
}
  • 運(yùn)行效果:


  • 執(zhí)行流程和內(nèi)存分析


成員變量的初始值

案例題目

編程實(shí)現(xiàn)Point類的定義窘拯,特征有:橫縱坐標(biāo)(整數(shù)),要求在main方法中聲明Point類型的引用指向Point對象并打印特征坝茎,然后將橫縱坐標(biāo)修改為3和5再次打印涤姊。

/*
    編程實(shí)現(xiàn)Point類的定義
*/
public class Point {
    
    int x; // 用于描述橫坐標(biāo)的成員變量
    int y; // 用于描述縱坐標(biāo)的成員變量
    
    public static void main(String[] args) {
        
        // 1.聲明Point類型的引用指向Point類型的對象
        Point p = new Point();
        // 打印成員變量的數(shù)值
        System.out.println("橫坐標(biāo):" + p.x + ",縱坐標(biāo):" + p.y); // 0 0
        
        System.out.println("-------------------------------------");
        
        // 2.將橫縱坐標(biāo)修改為3和5后再次打印
        p.x = 3;
        p.y = 5;
        System.out.println("橫坐標(biāo):" + p.x + ",縱坐標(biāo):" + p.y); // 3  
    }
}

成員方法的定義

  • 語法:
class 類名 {
    返回值類型 成員方法名(形參列表) {
        成員方法體;
    }
}
  • 列子:
class Person {
    void show(){
        System.out.println("沒事秀一下");
    }
}

當(dāng)成員方法名有多個(gè)單次組成時(shí),要求從第二個(gè)單詞起每個(gè)單詞的首字母大寫嗤放。

返回值類型

  • 返回值主要指從方法體內(nèi)返回到方法體外的數(shù)據(jù)內(nèi)容思喊。
  • 返回值類型主要指返回值的數(shù)據(jù)類型,可以是基本數(shù)據(jù)類型次酌,也可以是引用數(shù)據(jù)類型恨课。
  • 當(dāng)返回的數(shù)據(jù)內(nèi)容是66時(shí),則返回值類型寫int即可岳服。
  • 在方法體中使用return關(guān)鍵字可以返回具體的數(shù)據(jù)內(nèi)容并結(jié)束當(dāng)前方法剂公。
  • 當(dāng)返回的數(shù)據(jù)內(nèi)容是66時(shí),則方法體中寫return 66; 即可吊宋。
  • 當(dāng)該方法不需要返回任何數(shù)據(jù)內(nèi)容時(shí)纲辽,則返回值類型寫void即可。

形參類表

  • 形式參數(shù)主要用于將方法體外的數(shù)據(jù)內(nèi)容帶入到方法體內(nèi)部。
  • 形式參數(shù)列表主要指多個(gè)形式參數(shù)組成的列表拖吼,語法個(gè)數(shù)如下:

數(shù)據(jù)類型 形參變量名1, 數(shù)據(jù)類型 形參變量名2, ……

  • 當(dāng)帶入的數(shù)據(jù)內(nèi)容是"hello"時(shí)鳞上,則形參列表寫String s 即可
  • 當(dāng)帶入的數(shù)據(jù)內(nèi)容是66和"hello"時(shí),則形參列表寫 int i, String s 即可
  • 若該方法不需要帶入任何數(shù)據(jù)內(nèi)容時(shí)绿贞,則形參列表位置啥也不寫即可因块。

方法體的詳解

  • 成員方法體主要用于編寫描述該方法功能的語句塊。
  • 成員方法可以實(shí)現(xiàn)代碼的重用籍铁,簡化代碼涡上。
/*
    編程實(shí)現(xiàn)Person類的定義
*/
public class Person {
    
    // 數(shù)據(jù)類型 成員變量名 = 初始值;  - 其中 = 初始值拒名,通常都省略不寫
    String name; // 用于描述姓名的成員變量
    int age; // 用于描述年齡的成員變量
    
    // 自定義成員方法實(shí)現(xiàn)所有成員變量的打印
    // 返回值類型 方法名稱(形參列表) { 方法體; }
    void show() {
        // 成員變量和成員方法都屬于類內(nèi)部的成員吩愧,因此可以直接訪問成員變量不需要在加引用.的前綴
        System.out.println("我是" + name + ", 今年" + age + "歲了");
    }
}

方法的調(diào)用

  • 引用變量名.成員方法名(實(shí)參列表);
  • 實(shí)際參數(shù)列表主要用于對形式參數(shù)列表進(jìn)行初始化操作,因此參數(shù)的個(gè)數(shù)增显、類型以及順序都要完全一致
  • 實(shí)際參數(shù)可以傳遞直接量雁佳、變量、表達(dá)式同云、方法的調(diào)用等糖权。
/*
    編程實(shí)現(xiàn)Point類的定義
*/
public class Point {
    
    int x; // 用于描述橫坐標(biāo)的成員變量
    int y; // 用于描述縱坐標(biāo)的成員變量
    
    // 自定義成員方法實(shí)現(xiàn)成員變量數(shù)值的打印
    void show() {
        System.out.println("橫坐標(biāo):" + x + ",縱坐標(biāo):" + y);
    }
    
    public static void main(String[] args) {
        // 1.聲明Point類型的引用指向Point類型的對象
        Point p = new Point();
        // 打印成員變量的數(shù)值
        // System.out.println("橫坐標(biāo):" + p.x + ",縱坐標(biāo):" + p.y); // 0 0
        // 方法調(diào)用
        p.show();
        
        System.out.println("-------------------------------------");
        
        // 2.將橫縱坐標(biāo)修改為3和5后再次打印
        p.x = 3;
        p.y = 5;
        // System.out.println("橫坐標(biāo):" + p.x + ",縱坐標(biāo):" + p.y); // 3 5 
        p.show();
    }
}

可變長參數(shù)

  • 返回值類型 方法名(參數(shù)的類型... 參數(shù)名)
  • 方法參數(shù)部分指定類型的參數(shù)個(gè)數(shù)是可以改變的,也就是0~n個(gè)炸站。
  • 一個(gè)方法的形參列表中最多只能聲明一個(gè)可變形參星澳,并且需要參數(shù)列表的末尾。

方法的傳參過程

int max(int ia, int ib){
    …… …… ……
}
int a = 5;
int b = 6;
int res = m.max(a,b);
  1. 為main方法中的變量a旱易、b禁偎、res分配空間并初始化。


  1. 調(diào)用max方法阀坏,為max方法的形參變量ia如暖、ib分配空間。


  1. 將實(shí)參變量的數(shù)值賦值到形參變量的內(nèi)存空間中忌堂。


  1. max方法運(yùn)行完畢后返回盒至,形參變量空間釋放。


  1. main方法中的res變量得到max方法的返回值士修。


  2. main方法結(jié)束后釋放相關(guān)變量的內(nèi)存空間妄迁。

參數(shù)傳遞的注意事項(xiàng)

  • 基本數(shù)據(jù)類型的變量作為方法的參數(shù)傳遞時(shí),形參變量數(shù)值的改變通常不會(huì)影響到實(shí)參變量的數(shù)值李命,因?yàn)閮蓚€(gè)變量有各自獨(dú)立的內(nèi)存空間;
  • 引用數(shù)據(jù)類型的變量作為方法的參數(shù)傳遞時(shí)箫老,形參變量指向內(nèi)容的改變會(huì)影響到實(shí)參變量指向內(nèi)容的數(shù)值封字,因?yàn)閮蓚€(gè)變量指向同一塊內(nèi)存空間。
  • 當(dāng)引用數(shù)據(jù)類型的變量作為方法的參數(shù)傳遞時(shí),若形參變量改變指向后在改變指定的內(nèi)容阔籽,則通常不會(huì)影響到實(shí)參變量執(zhí)行內(nèi)容的改變流妻,因?yàn)閮蓚€(gè)變量指向不同的內(nèi)存空間。
/*
    編程實(shí)現(xiàn)參數(shù)傳遞的測試
*/
public class ArgumentTest {
    
    // 自定義成員方法打印參數(shù)傳入的整數(shù)數(shù)據(jù)
    // int ia = ib = 10
    void show1(int ia) {
        ia = 200;
        System.out.println("show方法中:ia = " + ia);
    }
    
    // 自定義成員方法打印參數(shù)傳入的數(shù)組內(nèi)容
    void show2(int[] arr1) {
        arr1 = new int[2]; // 加上該行代碼后笆制,相當(dāng)于在堆區(qū)中又重新申請一塊內(nèi)存空間
        arr1[0] = 200;
        System.out.println("show方法中:arr[0] = " + arr1[0]);
    }
    
    public static void main(String[] args) {
        
        // 1.聲明ArgumentTest類型的引用指向該類型的對象
        ArgumentTest at = new ArgumentTest();
        // 2.使用引用變量調(diào)用show1方法進(jìn)行測試
        int ib = 10;
        at.show1(ib);
        System.out.println("main方法中:ib = " + ib);
        
        System.out.println("----------------------------");
        
        // 3.調(diào)用show2方法進(jìn)行測試
        int[] arr2 = new int[]{10, 20};
        at.show2(arr2);
        System.out.println("main方法中:arr[0] = " + arr2[0]);
    }
}

內(nèi)存結(jié)構(gòu)之棧區(qū)

  • 棧用于存放程序運(yùn)行過程當(dāng)中所有的局部變量绅这。一個(gè)運(yùn)行的java程序從開始到結(jié)束會(huì)有多次方法的調(diào)用。
  • JVM會(huì)為每一個(gè)方法的調(diào)用在棧中分配一個(gè)對應(yīng)的空間在辆,這個(gè)空間稱為該方法的棧幀证薇。一個(gè)棧幀對應(yīng)一個(gè)正在調(diào)用中的方法,棧幀中存儲(chǔ)了該方法的參數(shù)匆篓、局部變量等數(shù)據(jù)浑度。
  • 當(dāng)某一個(gè)方法調(diào)用完成后,其對應(yīng)的棧幀將被清除鸦概。

傳參的相關(guān)概念

  • 參數(shù)分為形參和實(shí)參箩张,定義方法時(shí)的參數(shù)叫形參,調(diào)用方法時(shí)傳遞的參數(shù)叫做實(shí)參窗市。
  • 調(diào)用方法時(shí)采用值傳遞把實(shí)參傳遞給形參先慷,方法內(nèi)部其實(shí)是在使用形參。
  • 所謂值傳遞就是當(dāng)參數(shù)是基本類型時(shí)咨察,傳遞參數(shù)的值论熙,比如傳遞i=10,真實(shí)傳參時(shí)扎拣,把10復(fù)制給了形參赴肚。當(dāng)參數(shù)是對象時(shí),傳遞的是對象的值二蓝,也就是把對象的地址賦值給形參誉券。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市刊愚,隨后出現(xiàn)的幾起案子踊跟,更是在濱河造成了極大的恐慌,老刑警劉巖鸥诽,帶你破解...
    沈念sama閱讀 222,729評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件商玫,死亡現(xiàn)場離奇詭異,居然都是意外死亡牡借,警方通過查閱死者的電腦和手機(jī)拳昌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來钠龙,“玉大人炬藤,你說我怎么就攤上這事御铃。” “怎么了沈矿?”我有些...
    開封第一講書人閱讀 169,461評論 0 362
  • 文/不壞的土叔 我叫張陵上真,是天一觀的道長。 經(jīng)常有香客問我羹膳,道長睡互,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,135評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上暴氏,老公的妹妹穿的比我還像新娘募疮。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,130評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般蹂季。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上疏日,一...
    開封第一講書人閱讀 52,736評論 1 312
  • 那天偿洁,我揣著相機(jī)與錄音,去河邊找鬼沟优。 笑死涕滋,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的挠阁。 我是一名探鬼主播宾肺,決...
    沈念sama閱讀 41,179評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼侵俗!你這毒婦竟也來了锨用?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,124評論 0 277
  • 序言:老撾萬榮一對情侶失蹤隘谣,失蹤者是張志新(化名)和其女友劉穎增拥,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體寻歧,經(jīng)...
    沈念sama閱讀 46,657評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡掌栅,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,723評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了码泛。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片猾封。...
    茶點(diǎn)故事閱讀 40,872評論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖噪珊,靈堂內(nèi)的尸體忽然破棺而出忘衍,到底是詐尸還是另有隱情逾苫,我是刑警寧澤,帶...
    沈念sama閱讀 36,533評論 5 351
  • 正文 年R本政府宣布枚钓,位于F島的核電站,受9級特大地震影響瑟押,放射性物質(zhì)發(fā)生泄漏搀捷。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,213評論 3 336
  • 文/蒙蒙 一多望、第九天 我趴在偏房一處隱蔽的房頂上張望嫩舟。 院中可真熱鬧,春花似錦怀偷、人聲如沸家厌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,700評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽饭于。三九已至,卻和暖如春维蒙,著一層夾襖步出監(jiān)牢的瞬間掰吕,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,819評論 1 274
  • 我被黑心中介騙來泰國打工颅痊, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留殖熟,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,304評論 3 379
  • 正文 我出身青樓斑响,卻偏偏與公主長得像菱属,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子舰罚,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,876評論 2 361

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