1. 構(gòu)造方法【雞肋】
1.1 作用
用于在開發(fā)過程中創(chuàng)建對象使用先蒋,創(chuàng)建對象目前的格式
new 類名(可能用到的參數(shù));
類名(有可能用到的參數(shù));這就是構(gòu)造方法 Constructor
初始化當(dāng)前創(chuàng)建對象中的成員變量數(shù)據(jù)1绯拧界斜!
1.2 格式
格式:
? ? public 類名(所需初始化參數(shù)列表) {
?? ?? ? 初始化語句;
?? ?}
細(xì)節(jié):
? ? 1.構(gòu)造方法的名字必須是類名合冀,并且其他方法的名字不能是類名
? ? 2.構(gòu)造方法沒有返回值類型聲明
? ? 3.初始化參數(shù)列表和正常的方法列表操作使用一致
? ? 4.初始化語句各薇,大多數(shù)是一些賦值語句
1.3 貌似我們昨天沒有寫構(gòu)造方法,但我們用了【了解】
首先
? ? 在Eclipse的項目所在文件夾中君躺,bin目錄是存放當(dāng)前java程序?qū)?yīng)的所有.class 二進制文件(字節(jié)碼文件)峭判,趕文件保存了java文件對應(yīng)的所有內(nèi)容
? ? 這里可以通過返編譯工具看到一些特定的現(xiàn)象【了解】
? ??Java -c -1 -private XXX.class
Java編譯器行為
? ? 在代碼中任何沒有【顯式】自行聲明構(gòu)造方法,java編譯器會在編譯代碼的過程中輔助程序程序員完成一個無參數(shù)的構(gòu)造方法棕叫,供程序員使用
1.4 根據(jù)需求完成所需構(gòu)造方法
格式:
? ? public 類名(所需初始化參數(shù)列表){
?? ?? ? 初始化語句林螃;
?? ?}
需求:
? ? 1.完成對于姓名在創(chuàng)建對象時初始化的構(gòu)造方法
? ? 2.完成對于姓名,年齡創(chuàng)建對象時初始化的構(gòu)造方法
? ? 3.完成對于姓名俺泣,年齡治宣,性別創(chuàng)建對象時初始化的構(gòu)造方法
注意:
? ? 如果在代碼中程序員自行完成了構(gòu)造方法,java編譯器不再自動生成無參構(gòu)造方法砌滞。
【強制要求】
? ? 以后代碼無論在什么時候都要給用戶提供一個無參數(shù)構(gòu)造方法使用
package com.qianfeng.a.Object;
class Dog {
????//成員變量 Field
????String name;
????int age;
????char gender;
????//無參構(gòu)造方法
????public Dog() {}
????//完成對于姓名在創(chuàng)建對象時初始化的構(gòu)造方法
????public Dog(String n) {
????????//成員變量可以在類內(nèi)其他中直接使用【80%正確】
????????name = n;
????}
????//完成對于名字侮邀,年齡的初始化構(gòu)造方法
????public Dog(String n, int a) {
????????name = n;
????????age = a;
????}
????//完成對于名字,年齡贝润,性別的初始化構(gòu)造方法
????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) {
????????/*
???????? * 這里調(diào)用的是一個無參構(gòu)造方法
???????? * 該方法在Dog類內(nèi)是沒有定義的
???????? *
???????? * 以后用的比較多的情況大多數(shù)都是無參構(gòu)造方法
???????? *
???????? * The constructor Dog() is undefind
???????? */
????????//無參構(gòu)造方法
????????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 總結(jié)
1.構(gòu)造方法
? ? 功能是用于初始化創(chuàng)建對象的成員變量數(shù)據(jù)
? ? 構(gòu)造方法是一個方法绊茧,參數(shù)使用方式和方法一致
2.構(gòu)造方法選擇
? ??Java編譯器會根據(jù)構(gòu)造方法中的的【參數(shù)類型,個數(shù)打掘,順序】來做選擇华畏,如果沒有指定的構(gòu)造方法鹏秋,報錯!亡笑!
3.無論什么時候一定要給當(dāng)前類提供一個無參數(shù)構(gòu)造方法
4.以下代碼報錯
? ? Dog(String name);
? ? Dog(String color);
? ? 調(diào)用:
? ? ?? ?String color =?“red”;
? ? ?? ?Dog dog = new Dog(color);
? ? 在java代碼中不允許出現(xiàn)相同數(shù)據(jù)類型侣夷,個數(shù),順序的構(gòu)造方法仑乌,和參數(shù)名沒有關(guān)系百拓,java編譯器選擇過程中,有且只針對數(shù)據(jù)類型晰甚,個數(shù)衙传,順序選擇,參數(shù)名無所謂厕九。
2. 類對象內(nèi)存分析圖【重點】
3. this關(guān)鍵字【雞肋】
3.1 this關(guān)鍵字【重點】
this關(guān)鍵字表示對象本身
? ? 1.調(diào)用當(dāng)前方法的類對象
? ? 2.通過構(gòu)造方法創(chuàng)建的類對象
this表示一個對象1痛贰!扁远!當(dāng)前對象
3.1 目前this關(guān)鍵字解決的問題
可以在方法中使用this關(guān)鍵字區(qū)分操作的是成員變量還是局部變量
package com.qianfeng.a.constructor;
class Person {
????String name;
????int age;
????public Person() {
????????//this關(guān)鍵字表示通過new + 構(gòu)造方法創(chuàng)建的類對象本身
????????System.out.println("Constructor" + this);
????}
????public Person(String name) {
????????/*
???????? * 以下操作是沒有用的俊鱼,這是自娛自樂
???????? * 這里存在一個【就近原則】問題,如果出現(xiàn)和成員變量
???????? * 同名的局部變量畅买,采用就近原則
???????? */
????????//name = name;
????????/*
???????? *這里需要賦值操作的是當(dāng)前類對象中的name成員變量
???????? *this.成員變量名字 表示使用的就是當(dāng)前類對象的成員變量亭引,而不是方法的參數(shù)
???????? */
????????this.name = name;
????}
????public Person(String name, int age) {
????????this.name = name;
????????this.age = age;
????}
????public void test() {
????????//表示調(diào)用當(dāng)前方法的類對象
????????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. 封裝【重點,規(guī)范】
4.1 面向?qū)ο笕筇卣?/p>
封裝
? ? 最基本的思想
繼承
? ? 子承父業(yè)
多態(tài)
? ? 貓皮获,狗焙蚓,都是動物
? ? U盤,鍵盤洒宝,鼠標(biāo)购公,都是USb設(shè)備
? ? 【最難的是多態(tài),最簡單的也是多態(tài)】
?4.2 封裝雁歌,不單單是對于類的封裝
歸納總結(jié):旰啤!靠瞎!
? ? 循環(huán)封裝過程
? ? 方法封裝過程
? ? 類封裝數(shù)據(jù)
? ? 框架封裝模塊
? ? 一段代碼使用了3遍比庄,做成一個循環(huán)
? ? 一個循環(huán)使用了3遍蟀苛,做成一個方法
? ? 一個方法使用了3遍沿盅,做成一個工具類
? ? 一個工具類使用了3遍,做成一個文檔
?4.3 java中規(guī)范化封裝【javaBean規(guī)范】
要求:
? ? 1.所有的成員變量全部私有化【private修飾】
? ? 2.要求至少完成一個無參數(shù)構(gòu)造方法雹熬,其他無所謂
? ? 3.要求給予所有的成員變量對應(yīng)的setter和getter方法
4.3.1 權(quán)限修飾符
private
? ? 私有化內(nèi)容父能,使用private修飾的成員變量神凑,成員方法和構(gòu)造方法,有且只能類內(nèi)使用,類外沒有操作權(quán)限
? ? 使用private修飾的內(nèi)容有且只能在class所處大括號以內(nèi)使用
public
? ? 公開內(nèi)容溉委,只要存在對應(yīng)的類對象鹃唯,都可以通過類對象調(diào)用類內(nèi)的public修飾的成員變量和成員方法
4.3.2 解決私有化成員變量賦值和取值操作問題
private私有化修飾的成員變量,類外不能通過類對象操作瓣喊,取值坡慌,賦值
javaBean規(guī)范規(guī)定了
? ? setter ==> 賦值操作
? ? 格式:
?? ?? ? public void set成員變量名(對應(yīng)成員變量數(shù)據(jù)類型參數(shù)) {
?? ?? ? 賦值操作;
?? ??? ?}? ??
? ? getter ==> 取值操作
? ? 格式:
?? ?? ? public 對應(yīng)成員變量數(shù)據(jù)類型返回值 get成員變量名() {
?? ?? ? return 成員變量藻三;
?? ??? ?}
? ? 注意:
?? ?? ? 1.方法格式固定洪橘,setter和getter方法操作過程不能修改
?? ?? ? 2.方法需要符合命名規(guī)范,小駝峰命名法
?? ?? ? 3.boolean類型數(shù)據(jù)較特殊
?? ??? ?? ? boolean類型成員變量getter方法要求是is開頭
4.3.3 可以使用快捷方式快速完成代碼
package com.qianfeng.a.constructor;
/*
* 以后開發(fā)中一個【實體類】如何封裝如何書寫
* 實體類:
* ????????真實存在的一個數(shù)據(jù)趴酣,人,狗坑夯,英雄
*/
class LOLHero {
????private String name;
????private float hp;
????private float mp;
????//根據(jù)個人需求完成對應(yīng)構(gòu)造方法岖寞,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 關(guān)于javaBean規(guī)范總結(jié)
javaBean規(guī)范制定的要求
? ? 1.要求java中所有實體類成員變量全部私有化,最少提供一個無參數(shù)構(gòu)造方法柜蜈,對成員變量實現(xiàn)setter和getter方法
? ? 2.javaBean規(guī)范仗谆,是為了后期開發(fā)匯總更好的代碼適配度,提高代碼運行的統(tǒng)一性淑履,能夠滿足框架的使用
? ? 3.javaBean規(guī)范只是一個規(guī)范隶垮,而且是作為一個基礎(chǔ)規(guī)范,操作都是可以使用快捷鍵來完成的C卦搿狸吞!
4. 多類合作【重點】
5.1 汽車類和修理廠類分析
汽車
? ? 可以看作是一個類
? ? ?? ?成員變量:
? ? ?? ?名字
? ? ?? ?顏色
? ? ?? ?輪胎個數(shù)
? ? 成員方法:
? ? ?? ?飆車
?? ?? ? 飆車要有要求,輪胎個數(shù)必須為4
修理廠
? ? 可以看作是一個類
? ? 成員變量:
? ? ?? ?名字
? ? ?? ?地址
? ? ?? ?聯(lián)系方式
? ? 成員方法:
?? ?? ? 修理汽車的方法【重點】
?? ??? ?? ? 該方法是需要一個汽車類的對象
5.2 汽車類代碼實現(xiàn)
package com.qianfeng.b;
/*
* 汽車
* ????可以看作是一個類
* ????成員變量:
* ????????名字
* ????????顏色
* ????????輪胎個數(shù)
*
* ????成員方法:
* ????????飆車
* ????????????飆塵有要求指煎,輪胎個數(shù)必須為4
*/
public class Car {
????//成員變量 Field
????private String name;
????private String color;
????private int wheelCount;
????//構(gòu)造方法
????public Car() {}
????public Car(String name, String color, int wheelCount) {
????????this.name = name;
????????this.color = color;
????????this.wheelCount = wheelCount;
????}
????/**
???? * 飆車方法蹋偏,如果輪胎數(shù)不為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 修理廠類代碼實現(xiàn)
package com.qianfeng.b;
/*
* 修理廠
* ????可以看作是一個類
* ????成員變量:
* ????????名字
* ????????地址
* ????????電話
*
* ????成員方法:
* ????????修理汽車的方法【重點】
* ????????????該方法是需要一個汽車類對象
*/
public class Factory {
????//成員變量
????String name;
????String address;
????String tel;
????//構(gòu)造方法
????public Factory() {}
????public Factory(String name, String address, String tel) {
????????this.name = name;
????????this.address = address;
????????this.tel = tel;
????}
????/*
???? *修理汽車方法分析
???? *權(quán)限修飾符
???? *????public
???? *返回值類型
???? *????void
???? *方法名
???? *????repair
???? *形式參數(shù)列表【重點】
???? * ????1.這里需要一個汽車作為參數(shù)
???? * ????2.而且是必要參數(shù)
???? * ????3.這里需要的是一個汽車類對象
???? *????(Car car)這里是一個汽車類對象
???? *方發(fā)聲明
???? *????public void repair(Car car)
???? */
????/**
???? * 修理汽車的方法,需要的參數(shù)是一個汽車Car類對象
???? *
???? * @param car??Car類對象
???? * @throws InterruptedException
???? */
????public void repair(Car car) throws InterruptedException {
????????if (car.getWheelCount() < 4) {
????????????System.out.println("缺少輪胎像街,需要修理");
????????????//修改當(dāng)前汽車對象的輪胎個數(shù)黎棠,賦值為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內(nèi)可以直接使用對應(yīng)的class類
???????? */
????????Car car = new Car("特斯拉", "黑色", 4);
????????for (int i = 0; i < 10; i++) {
????????????car.race();
????????????/*
???????????? * 讓程序暫停0.5s镰绎,存在一個紅色的報錯脓斩。這里Ctrl + 1
???????????? * 快速修復(fù),選擇第一個
???????????? */
????????????Thread.sleep(500);
????????}
????????Thread.sleep(1000);
????????System.out.println("輪胎爆一個");
????????//輪胎爆一個
????????car.setWheelCount(3);
????????Thread.sleep(1000);
????????car.race();
????????//現(xiàn)在需要一個修理廠對象
????????Factory factory = new Factory();
????????factory.setAddress("勞動路轉(zhuǎn)盤");
????????factory.setName("狂人修車");
????????factory.setTel("18629433943");
????????/*
???????? * 這里需要通過Factory類對象畴栖,調(diào)用repair方法俭厚,修理汽車Car類對象
???????? */
????????factory.repair(car);
????????for (int i = 0; i < 10; i++) {
????????????car.race();
????????????Thread.sleep(500);
????????}
????}
}