day13 構造方法,this關鍵字和多類合作

1. 構造方法【雞肋】

1.1 作用

用于在開發過程中創建對象使用,創建對象目前的格式

new 類名(可能用到的參數);

類名(有可能用到的參數);這就是構造方法 Constructor

初始化當前創建對象中的成員變量數據!!

1.2 格式

格式:

? ? public 類名(所需初始化參數列表) {

?? ?? ? 初始化語句;

?? ?}

細節:

? ? 1.構造方法的名字必須是類名,并且其他方法的名字不能是類名

? ? 2.構造方法沒有返回值類型聲明

? ? 3.初始化參數列表和正常的方法列表操作使用一致

? ? 4.初始化語句,大多數是一些賦值語句

1.3 貌似我們昨天沒有寫構造方法,但我們用了【了解】

首先

? ? 在Eclipse的項目所在文件夾中,bin目錄是存放當前java程序對應的所有.class 二進制文件(字節碼文件),趕文件保存了java文件對應的所有內容

? ? 這里可以通過返編譯工具看到一些特定的現象【了解】

? ??Java -c -1 -private XXX.class

Java編譯器行為

? ? 在代碼中任何沒有【顯式】自行聲明構造方法,java編譯器會在編譯代碼的過程中輔助程序程序員完成一個無參數的構造方法,供程序員使用

1.4 根據需求完成所需構造方法

格式:

? ? public 類名(所需初始化參數列表){

?? ?? ? 初始化語句;

?? ?}

需求:

? ? 1.完成對于姓名在創建對象時初始化的構造方法

? ? 2.完成對于姓名,年齡創建對象時初始化的構造方法

? ? 3.完成對于姓名,年齡,性別創建對象時初始化的構造方法

注意:

? ? 如果在代碼中程序員自行完成了構造方法,java編譯器不再自動生成無參構造方法。

【強制要求】

? ? 以后代碼無論在什么時候都要給用戶提供一個無參數構造方法使用

package com.qianfeng.a.Object;

class Dog {

????//成員變量 Field

????String name;

????int age;

????char gender;


????//無參構造方法

????public Dog() {}

????//完成對于姓名在創建對象時初始化的構造方法

????public Dog(String n) {

????????//成員變量可以在類內其他中直接使用【80%正確】

????????name = n;

????}


????//完成對于名字,年齡的初始化構造方法

????public Dog(String n, int a) {

????????name = n;

????????age = a;

????}


????//完成對于名字,年齡,性別的初始化構造方法

????public Dog(String n, int a, char g) {

????????name = n;

????????age = a;

????????gender = g;

????}


????//成員方法

????public void eat() {

????????System.out.println("吃骨頭");

????}


????public void sleep() {

????????System.out.println("狗睡覺");

????}


????public void game() {

????????System.out.println("狗狗玩球");

????}

}

public class Demo1{

????public static void main(String[] args) {

????????/*

???????? * 這里調用的是一個無參構造方法

???????? * 該方法在Dog類內是沒有定義的

???????? *

???????? * 以后用的比較多的情況大多數都是無參構造方法

???????? *

???????? * The constructor Dog() is undefind

???????? */

????????//無參構造方法

????????Dog dog = new Dog();

????????System.out.println(dog.name);

????????System.out.println(dog.age);

????????System.out.println(dog.gender);


????????System.out.println("------------------");


????????Dog dog1 = new Dog("聶亮");

????????System.out.println(dog1.name);

????????System.out.println(dog1.age);

????????System.out.println(dog1.gender);


????????System.out.println("------------------");


????????Dog dog2 = new Dog("聶亮", 22);

????????System.out.println(dog2.name);

????????System.out.println(dog2.age);

????????System.out.println(dog2.gender);


????????System.out.println("------------------");


????????Dog dog3 = new Dog("聶亮", 22, '男');

????????System.out.println(dog3.name);

????????System.out.println(dog3.age);

????????System.out.println(dog3.gender);


????}

}

1.5 總結

1.構造方法

? ? 功能是用于初始化創建對象的成員變量數據

? ? 構造方法是一個方法,參數使用方式和方法一致

2.構造方法選擇

? ??Java編譯器會根據構造方法中的的【參數類型,個數,順序】來做選擇,如果沒有指定的構造方法,報錯!!

3.無論什么時候一定要給當前類提供一個無參數構造方法

4.以下代碼報錯

? ? Dog(String name);

? ? Dog(String color);

? ? 調用:

? ? ?? ?String color =?“red”;

? ? ?? ?Dog dog = new Dog(color);

? ? 在java代碼中不允許出現相同數據類型,個數,順序的構造方法,和參數名沒有關系,java編譯器選擇過程中,有且只針對數據類型,個數,順序選擇,參數名無所謂。

2. 類對象內存分析圖【重點】

3. this關鍵字【雞肋】

3.1 this關鍵字【重點】

this關鍵字表示對象本身

? ? 1.調用當前方法的類對象

? ? 2.通過構造方法創建的類對象

this表示一個對象!!!當前對象

3.1 目前this關鍵字解決的問題

可以在方法中使用this關鍵字區分操作的是成員變量還是局部變量

package com.qianfeng.a.constructor;

class Person {

????String name;

????int age;


????public Person() {

????????//this關鍵字表示通過new + 構造方法創建的類對象本身

????????System.out.println("Constructor" + this);

????}


????public Person(String name) {

????????/*

???????? * 以下操作是沒有用的,這是自娛自樂

???????? * 這里存在一個【就近原則】問題,如果出現和成員變量

???????? * 同名的局部變量,采用就近原則

???????? */

????????//name = name;


????????/*

???????? *這里需要賦值操作的是當前類對象中的name成員變量

???????? *this.成員變量名字 表示使用的就是當前類對象的成員變量,而不是方法的參數

???????? */

????????this.name = name;

????}


????public Person(String name, int age) {

????????this.name = name;

????????this.age = age;

????}


????public void test() {

????????//表示調用當前方法的類對象

????????System.out.println("test:" + this);

????}

}

public class Demo3 {

????public static void main(String[] args) {

????????Person person = new Person();


????????System.out.println("main:" + person);

????????person.test();


????????// PFSP private final static Person

????}

}

4. 封裝【重點,規范】

4.1 面向對象三大特征

封裝

? ? 最基本的思想

繼承

? ? 子承父業

多態

? ? 貓,狗,都是動物

? ? U盤,鍵盤,鼠標,都是USb設備

? ? 【最難的是多態,最簡單的也是多態】

?4.2 封裝,不單單是對于類的封裝

歸納總結!!!

? ? 循環封裝過程

? ? 方法封裝過程

? ? 類封裝數據

? ? 框架封裝模塊

? ? 一段代碼使用了3遍,做成一個循環

? ? 一個循環使用了3遍,做成一個方法

? ? 一個方法使用了3遍,做成一個工具類

? ? 一個工具類使用了3遍,做成一個文檔

?4.3 java中規范化封裝【javaBean規范】

要求:

? ? 1.所有的成員變量全部私有化【private修飾】

? ? 2.要求至少完成一個無參數構造方法,其他無所謂

? ? 3.要求給予所有的成員變量對應的setter和getter方法

4.3.1 權限修飾符

private

? ? 私有化內容,使用private修飾的成員變量,成員方法和構造方法,有且只能類內使用,類外沒有操作權限

? ? 使用private修飾的內容有且只能在class所處大括號以內使用

public

? ? 公開內容,只要存在對應的類對象,都可以通過類對象調用類內的public修飾的成員變量和成員方法

4.3.2 解決私有化成員變量賦值和取值操作問題

private私有化修飾的成員變量,類外不能通過類對象操作,取值,賦值

javaBean規范規定了

? ? setter ==> 賦值操作

? ? 格式:

?? ?? ? public void set成員變量名(對應成員變量數據類型參數) {

?? ?? ? 賦值操作;

?? ??? ?}? ??

? ? getter ==> 取值操作

? ? 格式:

?? ?? ? public 對應成員變量數據類型返回值 get成員變量名() {

?? ?? ? return 成員變量;

?? ??? ?}

? ? 注意:

?? ?? ? 1.方法格式固定,setter和getter方法操作過程不能修改

?? ?? ? 2.方法需要符合命名規范,小駝峰命名法

?? ?? ? 3.boolean類型數據較特殊

?? ??? ?? ? boolean類型成員變量getter方法要求是is開頭

4.3.3 可以使用快捷方式快速完成代碼

package com.qianfeng.a.constructor;

/*

* 以后開發中一個【實體類】如何封裝如何書寫

* 實體類:

* ????????真實存在的一個數據,人,狗,英雄

*/

class LOLHero {

????private String name;

????private float hp;

????private float mp;


????//根據個人需求完成對應構造方法,setter和getter方法

????//Shift + Alt + s

????public LOLHero() {}


????public LOLHero(String name, float hp, float mp) {

????????this.name = name;

????????this.hp = hp;

????????this.mp = mp;

????}

????public String getName() {

????????return name;

????}

????public void setName(String name) {

????????this.name = name;

????}

????public float getHp() {

????????return hp;

????}

????public void setHp(float hp) {

????????this.hp = hp;

????}

????public float getMp() {

????????return mp;

????}

????public void setMp(float mp) {

????????this.mp = mp;

????}

}

4.3.4 關于javaBean規范總結

javaBean規范制定的要求

? ? 1.要求java中所有實體類成員變量全部私有化,最少提供一個無參數構造方法,對成員變量實現setter和getter方法

? ? 2.javaBean規范,是為了后期開發匯總更好的代碼適配度,提高代碼運行的統一性,能夠滿足框架的使用

? ? 3.javaBean規范只是一個規范,而且是作為一個基礎規范,操作都是可以使用快捷鍵來完成的!!

4. 多類合作【重點】

5.1 汽車類和修理廠類分析

汽車

? ? 可以看作是一個類

? ? ?? ?成員變量:

? ? ?? ?名字

? ? ?? ?顏色

? ? ?? ?輪胎個數

? ? 成員方法:

? ? ?? ?飆車

?? ?? ? 飆車要有要求,輪胎個數必須為4

修理廠

? ? 可以看作是一個類

? ? 成員變量:

? ? ?? ?名字

? ? ?? ?地址

? ? ?? ?聯系方式

? ? 成員方法:

?? ?? ? 修理汽車的方法【重點】

?? ??? ?? ? 該方法是需要一個汽車類的對象

5.2 汽車類代碼實現

package com.qianfeng.b;

/*

* 汽車

* ????可以看作是一個類

* ????成員變量:

* ????????名字

* ????????顏色

* ????????輪胎個數

*

* ????成員方法:

* ????????飆車

* ????????????飆塵有要求,輪胎個數必須為4

*/

public class Car {

????//成員變量 Field

????private String name;

????private String color;

????private int wheelCount;


????//構造方法

????public Car() {}


????public Car(String name, String color, int wheelCount) {

????????this.name = name;

????????this.color = color;

????????this.wheelCount = wheelCount;

????}


????/**

???? * 飆車方法,如果輪胎數不為4,提示需要找修理廠

???? */

????public void race() {

????????if (4 == wheelCount) {

????????????System.out.println("開著" + color + "的" + name + "驪山彎道飆車時速280KM/H");

????????} else {

????????????System.out.println("缺少輪胎,快去修理廠!");

????????}

????}

????//setter和getter方法 Method

????public String getName() {

????????return name;

????}

????public void setName(String name) {

????????this.name = name;

????}

????public String getColor() {

????????return color;

????}

????public void setColor(String color) {

????????this.color = color;

????}

????public int getWheelCount() {

????????return wheelCount;

????}

????public void setWheelCount(int wheelCount) {

????????this.wheelCount = wheelCount;

????}

}

5.3 修理廠類代碼實現

package com.qianfeng.b;

/*

* 修理廠

* ????可以看作是一個類

* ????成員變量:

* ????????名字

* ????????地址

* ????????電話

*

* ????成員方法:

* ????????修理汽車的方法【重點】

* ????????????該方法是需要一個汽車類對象

*/

public class Factory {

????//成員變量

????String name;

????String address;

????String tel;


????//構造方法

????public Factory() {}


????public Factory(String name, String address, String tel) {

????????this.name = name;

????????this.address = address;

????????this.tel = tel;

????}


????/*

???? *修理汽車方法分析

???? *權限修飾符

???? *????public

???? *返回值類型

???? *????void

???? *方法名

???? *????repair

???? *形式參數列表【重點】

???? * ????1.這里需要一個汽車作為參數

???? * ????2.而且是必要參數

???? * ????3.這里需要的是一個汽車類對象

???? *????(Car car)這里是一個汽車類對象

???? *方發聲明

???? *????public void repair(Car car)

???? */

????/**

???? * 修理汽車的方法,需要的參數是一個汽車Car類對象

???? *

???? * @param car??Car類對象

???? * @throws InterruptedException

???? */

????public void repair(Car car) throws InterruptedException {

????????if (car.getWheelCount() < 4) {

????????????System.out.println("缺少輪胎,需要修理");


????????????//修改當前汽車對象的輪胎個數,賦值為4

????????????car.setWheelCount(4);


????????????//報錯,com + 1 選擇第一個回車

????????????Thread.sleep(1000);


????????????System.out.println("¥100000");

????????} else {

????????????System.out.println("腦子進書了");

????????}

????}


????//setter和getter方法 Method

????public String getName() {

????????return name;

????}

????public void setName(String name) {

????????this.name = name;

????}

????public String getAddress() {

????????return address;

????}

????public void setAddress(String address) {

????????this.address = address;

????}

????public String getTel() {

????????return tel;

????}

????public void setTel(String tel) {

????????this.tel = tel;

????}????

}

5.4 主方法代碼

package com.qianfeng.b;

public class Demo {

????public static void main(String[] args) throws

????InterruptedException{

????????/*

???????? * 同包package內可以直接使用對應的class類

???????? */

????????Car car = new Car("特斯拉", "黑色", 4);


????????for (int i = 0; i < 10; i++) {

????????????car.race();


????????????/*

???????????? * 讓程序暫停0.5s,存在一個紅色的報錯。這里Ctrl + 1

???????????? * 快速修復,選擇第一個

???????????? */

????????????Thread.sleep(500);

????????}

????????Thread.sleep(1000);


????????System.out.println("輪胎爆一個");

????????//輪胎爆一個

????????car.setWheelCount(3);


????????Thread.sleep(1000);

????????car.race();


????????//現在需要一個修理廠對象

????????Factory factory = new Factory();


????????factory.setAddress("勞動路轉盤");

????????factory.setName("狂人修車");

????????factory.setTel("18629433943");


????????/*

???????? * 這里需要通過Factory類對象,調用repair方法,修理汽車Car類對象

???????? */

????????factory.repair(car);


????????for (int i = 0; i < 10; i++) {

????????????car.race();


????????????Thread.sleep(500);

????????}

????}

}

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,578評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,701評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,691評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,974評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,694評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,026評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,015評論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,193評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,719評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,442評論 3 360
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,668評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,151評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,846評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,255評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,592評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,394評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,635評論 2 380