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);
????????}
????}
}