版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
第4章面向?qū)ο螅ㄉ希禞ava面向?qū)ο蟪绦蛟O計案例教程(第2版)》目錄/Contents4.14.24.3面向?qū)ο蟮乃枷腩惻c對象封裝性4.4
構造方法4.54.6this關鍵字tatic關鍵字思政要點/Point系統(tǒng)思維
面向?qū)ο缶幊虖娬{(diào)整體性和系統(tǒng)性,培養(yǎng)學生的系統(tǒng)思維。抽象能力
通過面向?qū)ο蟮母拍睿囵B(yǎng)學生的抽象思維和建模能力。創(chuàng)新設計鼓勵學生進行類的設計和創(chuàng)新,培養(yǎng)創(chuàng)新精神和設計能力。團隊合作
面向?qū)ο缶幊绦枰獔F隊合作,培養(yǎng)學生的團隊協(xié)作精神和溝通能力。面向?qū)ο蟮乃枷?.14.1.1程序設計語言的發(fā)展面向?qū)ο笫前褑栴}事物分解成各個對象,把多個功能合理地放到不同對象里,強調(diào)的是具備某些功能的對象。通過調(diào)用對象的方法來實現(xiàn)程序功能。面向?qū)ο蟮母呒壋绦蛟O計語言這屬于第一代程序設計語言,早期的程序設計需要面向機器來編寫代碼,針對不同的機器編寫不同的二進制代碼來控制計算機執(zhí)行操作面向機器的低級程序設計語言面向過程就是分析出解決問題所需要的步驟,然后用函數(shù)把這些步驟一步一步實現(xiàn),使用的時候依次調(diào)用這些函數(shù)。面向過程的高級程序設計語言0201程序設計語言034.1.2面向?qū)ο蟪绦蛟O計方法封裝封裝封裝就是把客觀事物封裝成抽象的類,并且類可以把自己的數(shù)據(jù)和方法只讓可信的類或者對象操作,對不可信的進行信息隱藏。也就是把屬性私有化,提供公共方法訪問私有對象。繼承繼承是類之間的一種關系,當多個類具有相同的特征(屬性)和行為(方法)時,可以將相同的部分抽取出來放到一個類中作為父類,其他類繼承這個父類。繼承后子類自動擁有了父類的屬性和方法。多態(tài)多態(tài)是指一個類實例的相同方法在不同情形下有不同表現(xiàn)形式。多態(tài)機制使具有不同內(nèi)部結構的對象可以共享相同的外部接口。類與對象4.2類是對一組有相同屬性和相同功能的對象的概括,一個類所包含的數(shù)據(jù)和方法能夠描述一組對象的共同屬性和行為。4.2.1類的定義定義一個類的步驟(1)定義類使用關鍵字class,然后定義類名。(2)編寫類的屬性,即聲明變量。(3)編寫類的方法。4.2.1類的定義類的一般格式如下:class類名{
//定義屬性部分(成員變量)
屬性1的類型屬性1;屬性2的類型屬性2;…屬性m的類型屬性m;
//定義方法部分方法1();方法2();…方法n();}說明:(1)?class是Java的關鍵字,表明其后定義的是一個類。(2)類名必須是合法的標識符,一般情況下單詞首字母大寫。如果類名由多個單詞組成,每個單詞的首字母均要大寫,其余字母小寫。類名最好見名知意,如People、HelloWorld等。(3)屬性的類型可以是Java的基本數(shù)據(jù)類型,也可以是數(shù)組、字符串或者其他類等引用數(shù)據(jù)類型。多個同類型的變量,也可以一起聲明。(4)?class前的修飾符可以有多個,用來限定類的使用方式,在后續(xù)章節(jié)會詳細說明?!纠?-1】定義一個狗的類,它有兩個屬性name和age,以及一個方法bark。publicclassDog{//字段(屬性)Stringname;intage;
//方法(行為)voidbark(){System.out.println("汪汪!");}}4.2.1類的定義【例4-2】編寫一個名為Car的類,它的屬性包括:品牌(make)、型號(model)、年份(year)、顏色(color),同時它具有能夠啟動和剎車的功能。publicclassCar{//屬性Stringmake;//品牌Stringmodel;//型號intyear;//年份Stringcolor;//顏色4.2.1類的定義//方法publicvoidstartEngine(){System.out.println("啟動汽車!");}publicvoidstopEngine(){System.out.println("剎車!");}}1.對象的創(chuàng)建對象是根據(jù)類創(chuàng)建的。在Java中,使用關鍵字new來創(chuàng)建一個新的對象。創(chuàng)建對象需要以下三步:(1)聲明:聲明一個對象,包括對象名稱和對象類型。(2)實例化:使用關鍵字new來創(chuàng)建一個對象,new運算符用于為對象分配存儲空間。(3)初始化:使用new創(chuàng)建對象時,會調(diào)用構造方法初始化對象。類名對象名;對象名=new類名();創(chuàng)建對象的一般格式:
4.2.2對象的創(chuàng)建與使用類名對象名=new類名();或者,也可以將上述兩行代碼合寫成:
DogmyDogmyDog=newDog();例如:
或者:DogmyDog=newDog();1.對象的創(chuàng)建一個類中可以創(chuàng)建多個對象,對象創(chuàng)建后就擁有了類中所有的成員變量和方法,例如上述例子中Dog類中可以創(chuàng)建多個對象。DogmyDog1=newDog();DogmyDog2=newDog();4.2.2對象的創(chuàng)建與使用2.對象的使用對象的使用原則是先定義后使用。對象在創(chuàng)建之后就擁有了類定義中的所有成員變量,可以使用“?·?”運算符對各個成員進行訪問,完成各種操作。引用對象成員的一般格式是:對象名.成員變量;對象名.成員方法();4.2.2對象的創(chuàng)建與使用DogmyDog=newDog();myD=“小黑”; //給name屬性賦值“小黑”myDog.age=15; //給age屬性賦值15引用對象的成員變量:
myDog.bark();////調(diào)用bark()方法調(diào)用對象的成員方法:
【例4-3】為例4-1的Dog類創(chuàng)建對象,并對其成員變量和方法進行訪問,完成各種操作。publicclassDog{//字段(屬性)Stringname;intage;//方法(行為)voidbark(){System.out.println("汪汪!");}publicstaticvoidmain(String[]args){//創(chuàng)建Dog類的對象DogmyDog=newDog();
//使用對象的字段myD="小黑";myDog.age=5;4.2.2對象的創(chuàng)建與使用
//使用對象的字段myD="小黑";myDog.age=5;//調(diào)用對象的方法myDog.bark();//輸出:汪汪!//訪問對象的字段System.out.println("狗的名字是:"+myD);}}程序運行結果:【例4-4】對象的傳遞publicclassMain{publicstaticvoidmain(String[]args){Dogdog1=newDog();="大黃";Dogdog2=dog1;//dog2引用了dog1指向的對象="小黑";//由于dog1和dog2都引用同一個對象,因此輸出將是"小黑"System.out.println("dog1的名字是:"+);}}4.2.3對象的引用傳遞程序運行結果:在Java中,對象是通過引用來傳遞的。當你將一個對象賦值給另一個變量時,你實際上是在復制對象的引用,而不是對象本身。這意味著兩個變量都指向同一個對象。封裝性4.34.3.1封裝的意義Java中的封裝(Encapsulation)是面向?qū)ο缶幊痰囊粋€核心概念,它通過將對象的屬性(字段)和方法(行為)結合在一起,并隱藏對象的內(nèi)部實現(xiàn)細節(jié),僅對外提供有限的訪問接口,從而增強代碼的安全性、可維護性和靈活性。封裝的意義數(shù)據(jù)隱藏與保護提高代碼模塊化增強安全性簡化接口4.3.2封裝的實現(xiàn)在Java中,封裝通常通過以下方式實現(xiàn):1.使用private訪問修飾符:將類的屬性聲明為private,以防止外部類直接訪問和修改這些屬性。2.提供公共的getter和setter方法:為private屬性提供公共的訪問和修改方法,這些方法通常被稱為getter和setter方法。3.在setter方法中添加驗證邏輯:可以在setter方法中添加額外的邏輯來驗證輸入的值,并在必要時拋出異?;虿扇∑渌胧?。4.3.2封裝的實現(xiàn)創(chuàng)建一個簡單的Person類,它包含一些基本的個人信息,如姓名、年齡和電子郵件地址。通過封裝,我們將隱藏這些信息的直接訪問,并提供公共的getter和setter方法來安全地訪問和修改它們?!纠?-5】定義類及其成員變量publicclassPerson{//使用private修飾符隱藏成員變量privateStringname;privateintage;privateStringemail;
//無參構造方法publicPerson(){}//有參構造方法,用于初始化對象publicPerson(Stringname,intage,Stringemail){this.setName(name);this.setAge(age);this.setEmail(email);}4.3.2封裝的實現(xiàn)【例4-6】提供公共的getter和setter方法publicStringgetName(){returnname;}
//提供公共的setter方法設置屬性值,并添加驗證邏輯publicvoidsetName(Stringname){if(name!=null&&!name.isEmpty()){=name;}else{System.out.println("姓名不能為空!");="未知";}}
publicintgetAge(){returnage;}//提供公共的setter方法設置年齡,并添加驗證邏輯publicvoidsetAge(intage){if(age>0){this.age=age;}else{System.out.println("年齡必須大于0!");this.age=0;//或者設置為一個默認值,比如-1表示無效年齡}}
publicStringgetEmail(){returnemail;}
4.3.2封裝的實現(xiàn)【例4-6】提供公共的getter和setter方法//提供公共的setter方法設置電子郵件地址,并添加驗證邏輯publicvoidsetEmail(Stringemail){//這里只是一個簡單的驗證,實際應用中可能需要更復雜的驗證邏輯if(email!=null&&email.contains("@")&&email.contains(".")){this.email=email;}else{System.out.println("請輸入有效的電子郵件地址!");this.email="unknown@";//或者設置為null或空字符串}}}4.3.2封裝的實現(xiàn)【例4-7】測試類publicclassPersonTest{publicstaticvoidmain(String[]args){//創(chuàng)建Person對象并測試封裝性Personperson=newPerson();
//設置屬性值并測試驗證邏輯person.setName("");//輸出:姓名不能為空!person.setAge(-5);//輸出:年齡必須大于0!person.setEmail("invalid-email");//輸出:請輸入有效的電子郵件地址!//正確的屬性值設置person.setName("張三");person.setAge(30);person.setEmail("zhagnsan@");
//訪問屬性值并打印System.out.println("姓名:"+person.getName());//輸出:姓名:張三System.out.println("年齡:"+person.getAge());//輸出:年齡:30System.out.println("電子郵件地址:"+person.getEmail());//輸出:電子郵件地址:alice@}}構造方法4.4構造方法是一種特殊的成員方法,其作用是負責對象的初始化工作,為實例變量賦予合適的初始值。定義構造方法的格式是:類名(形參列表){//方法體;}構造方法必須滿足以下語法規(guī)則:(1)構造方法的方法名必須與類名一樣。(2)構造方法沒有返回類型,也不能定義為void,在方法名前面不聲明方法類型。(3)構造方法不能被static、final、synchronized、abstract和native修飾。(4)構造方法在初始化對象時自動執(zhí)行,一般不能顯式地直接調(diào)用。當同一個類存在多個構造方法時,Java編譯系統(tǒng)會自動按照初始化時最后面括號的參數(shù)個數(shù)以及參數(shù)類型來一一對應,完成構造函數(shù)的調(diào)用。(5)構造方法的訪問修飾符只能使用public或者默認,一般聲明為public,如果保持默認則只能在同一個包中創(chuàng)建該類的對象。(6)構造方法分為兩種:無參構造方法和有參構造方法。4.4.1構造方法的定義【例4-8】將例4-1的Dog類分別定義無參構造方法和有參構造方法,并為成員變量賦初值。packagecom.test;publicclassDog{//字段(屬性)Stringname;intage;//無參構造方法publicDog(){name="小黑";age=5;System.out.println("無參構造方法執(zhí)行了");}4.4.1構造方法的定義//有參構造方法publicDog(Stringn,inta){name=n;age=a;System.out.println("有參構造方法執(zhí)行了");}//方法(行為)voidbark(){System.out.println("汪汪!");}voidshow(){System.out.println("dog1的名字是:"+name);System.out.println("dog1的年齡是:"+age);}4.4.1構造方法的定義publicstaticvoidmain(String[]args){//通過無參的構造方法可以創(chuàng)建對象Dogdog1=newDog();dog1.bark();dog1.show();
//通過有參的構造方法也可以創(chuàng)建對象,并給對象中的實例變量賦初值Dogdog2=newDog("大黃",7);dog2.bark();dog2.show();}}4.4.1構造方法的定義程序運行結果如圖所示在Java中,構造方法(也稱為構造函數(shù))是可以被重載的。這意味著一個類可以有多個構造方法,只要它們的參數(shù)列表不同即可。重載的構造方法允許我們在創(chuàng)建對象時以不同的方式初始化對象的狀態(tài)?!纠?-9】重載構造方法的Dog類示例:publicclassDog{//字段(屬性)Stringname;intage;Stringbreed;//新增的品種字段
//無參數(shù)的默認構造方法publicDog(){name="無名";age=0;breed="未知品種";}4.4.2構造方法的重載//帶一個參數(shù)的構造方法,僅設置名字publicDog(Stringn){name=n;age=0;//可以選擇默認值或拋出異常要求調(diào)用者提供breed="未知品種";}
//帶兩個參數(shù)的構造方法,設置名字和年齡publicDog(Stringn,inta){name=n;age=a;breed="未知品種";//或者可以選擇其他默認值}
//帶三個參數(shù)的構造方法,設置名字、年齡和品種publicDog(Stringn,inta,Stringb){name=n;age=a;breed=b;}
4.4.2構造方法的重載//方法(行為)voidbark(){System.out.println("汪汪!");}
//為了方便,可以添加getter和setter方法來訪問和修改字段(推薦)publicStringgetName(){returnname;}
publicvoidsetName(Stringname){=name;//這里仍然使用了this,但只是為了展示setter方法的常見實現(xiàn)}
publicintgetAge(){returnage;}
publicvoidsetAge(intage){this.age=age;}
4.4.2構造方法的重載publicStringgetBreed(){returnbreed;}
publicvoidsetBreed(Stringbreed){this.breed=breed;}
publicstaticvoidmain(String[]args){ //使用無參數(shù)的默認構造方法Dogdog1=newDog();System.out.println(dog1.getName()+"是"+dog1.getAge()+"歲"+dog1.getBreed());
//使用帶一個參數(shù)的構造方法Dogdog2=newDog("小黑");System.out.println(dog2.getName()+"是"+dog2.getAge()+"歲"+dog2.getBreed());//使用帶兩個參數(shù)的構造方法Dogdog3=newDog("大黃",5);System.out.println(dog3.getName()+"是"+dog3.getAge()+"歲"+dog3.getBreed());4.4.2構造方法的重載//使用帶三個參數(shù)的構造方法Dogdog4=newDog("小白",3,"貴賓犬");System.out.println(dog4.getName()+"是"+dog4.getAge()+"歲"+dog4.getBreed());} }程序運行結果如圖所示4.4.2構造方法的重載this關鍵字4.5當類的成員變量(屬性)與構造方法或成員方法的參數(shù)名相同時,為了區(qū)分它們,我們可以使用
this
關鍵字來引用成員變量。這樣做可以避免命名沖突?!纠?-10】使用this關鍵字調(diào)用本類中的屬性publicclassPerson{Stringname;//成員變量
publicPerson(Stringname){=name;//使用this區(qū)分成員變量和參數(shù)}}4.5.1使用this關鍵字調(diào)用本類中的屬性在上面的例子中,構造方法的參數(shù)
name
和類的成員變量
name
同名。通過
=name;,我們將參數(shù)
name
的值賦給了成員變量
name。this
關鍵字也可以用于調(diào)用當前類的成員方法。雖然這通常不是必需的(因為你可以直接調(diào)用方法名),但在某些情況下,使用
this
可以提高代碼的可讀性或解決命名沖突?!纠?-11】使用this關鍵字調(diào)用成員方法publicclassPerson{voiddisplay(){System.out.println("Displaymethodcalled");}
voidshow(){this.display();//使用this調(diào)用本類的成員方法}}4.5.2使用this關鍵字調(diào)用成員方法在上面的例子中,show
方法通過
this.display();
調(diào)用了同一類的
display
方法。雖然直接調(diào)用
display();
也是可以的,但在某些復雜的上下文中,使用
this
可以使代碼更加清晰。在一個構造方法中,可以使用
this
關鍵字來調(diào)用同一個類的另一個構造方法。這是實現(xiàn)構造方法重載時的一種常見做法,可以避免在多個構造方法中編寫重復的代碼?!纠?-12】使用this關鍵字調(diào)用本類的構造方法publicclassPerson{Stringname;intage;
//無參數(shù)構造方法publicPerson(){this("Unknown",0);//調(diào)用有參數(shù)的構造方法}//有參數(shù)構造方法publicPerson(Stringname,intage){=name;this.age=age;}}4.5.3使用this關鍵字調(diào)用本類的構造方法在上面的例子中,無參數(shù)的構造方法
Person()
通過
this("Unknown",0);
調(diào)用了有參數(shù)的構造方法
Person(Stringname,intage)。這樣,無參數(shù)的構造方法就利用了有參數(shù)構造方法的代碼來初始化對象。4.5.3使用this關鍵字調(diào)用本類的構造方法使用
this
調(diào)用構造方法必須是構造方法中的第一條語句。這是因為構造方法的調(diào)用必須首先發(fā)生,以便正確地初始化對象。如果先執(zhí)行了其他代碼,然后再調(diào)用另一個構造方法,可能會導致對象的狀態(tài)不一致或拋出異常。static關鍵字4.64.6.1靜態(tài)變量Java語言中沒有全局的概念,但可以通過static關鍵字來達到全局的效果。Java類提供了兩種類型的變量:用static關鍵字修飾的靜態(tài)變量和沒有static關鍵字修飾的實例變量。靜態(tài)變量屬于類,只要靜態(tài)變量所在的類被加載,這個靜態(tài)類就會被分配空間,因此就可以被使用。對靜態(tài)變量的引用有兩種方式,分別為“類.靜態(tài)變量”和“對象.靜態(tài)變量”?!纠?-13】靜態(tài)變量程序?qū)嵗?。publicclassTest{staticStringhobby="Java";publicstaticvoidmain(String[]args){//靜態(tài)變量可以直接使用類名來訪問,無需創(chuàng)建對象System.out.println("通過類名訪問hobby:"+Test.hobby);//創(chuàng)建類的對象Testt=newTest();//使用對象名來訪問靜態(tài)變量System.out.println("通過對象名訪問hobby:"+t.hobby);//使用對象名的形式修改靜態(tài)變量的值t.hobby="我愛學Java";//再次使用類名訪問靜態(tài)變量,值已被修改System.out.println("通過類名訪問hobby:"+t.hobby); }}程序運行結果如圖所示4.6.1靜態(tài)變量與靜態(tài)變量一樣,我們也可以使用static修飾方法
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025西南計算機有限責任公司招聘21人筆試考試參考題庫及答案解析
- 2025云南昆明市尋甸縣衛(wèi)生健康系統(tǒng)第二批招聘編外人員40人參考考試試題及答案解析
- 2025四川宜賓臨港投資建設集團有限公司下屬子公司第五批項目制員工招聘3人備考筆試試題及答案解析
- 2025甘肅省新華書店有限責任公司招聘(57人)模擬筆試試題及答案解析
- 深度解析(2026)《GBT 25781-2010 1-萘胺》(2026年)深度解析
- 深度解析(2026)《GBT 25719-2010電液錘 技術條件》(2026年)深度解析
- 2025福建福清市明德幼兒園招聘筆試考試備考題庫及答案解析
- 2025年安徽江淮汽車集團股份有限公司公開招聘工作人員1人考試筆試參考題庫附答案解析
- 2025北方自動控制技術研究所招聘43人備考考試試題及答案解析
- 《兩、三位數(shù)除以一位數(shù)》數(shù)學課件教案
- 項目分包制合同范本
- (2026.01.01施行)《生態(tài)環(huán)境監(jiān)測條例》解讀與實施指南課件
- 2025年及未來5年市場數(shù)據(jù)中國廢舊輪胎循環(huán)利用市場深度分析及投資戰(zhàn)略咨詢報告
- 《科研倫理與學術規(guī)范》期末考試試題及答案2025
- 2025天津大學管理崗位集中招聘15人考試筆試備考題庫及答案解析
- Unit 7 When Tomorrow Comes Section A (1a-1d) 課件 2025-2026學年人教版八年級英語上冊
- 2025年影像成像原理考試題庫
- 2025年智能制造工廠改造項目可行性研究報告及總結分析
- 國電投面試技巧與實戰(zhàn)經(jīng)驗交流
- 律師事務所訴訟案件辦案進度及當事人滿意度績效評定表
- 2025年公務員多省聯(lián)考《申論》題(陜西A卷)及參考答案
評論
0/150
提交評論