Java網(wǎng)絡(luò)程序設(shè)計(jì) 課件 單元4 類與對象應(yīng)用_第1頁
Java網(wǎng)絡(luò)程序設(shè)計(jì) 課件 單元4 類與對象應(yīng)用_第2頁
Java網(wǎng)絡(luò)程序設(shè)計(jì) 課件 單元4 類與對象應(yīng)用_第3頁
Java網(wǎng)絡(luò)程序設(shè)計(jì) 課件 單元4 類與對象應(yīng)用_第4頁
Java網(wǎng)絡(luò)程序設(shè)計(jì) 課件 單元4 類與對象應(yīng)用_第5頁
已閱讀5頁,還剩96頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

類與對象應(yīng)用單元四類和對象概述Java類構(gòu)造方法目錄CONTENTS123對象初始化過程重載45繼承多態(tài)

78抽象和封裝

6抽象類接口

1011包和訪問控制

9目錄CONTENTS4.1類和對象概述面向?qū)ο蟪绦蛟O(shè)計(jì)是一種程序設(shè)計(jì)范型,同時也是一種程序開發(fā)的方法。對象指的是類的實(shí)例。它將對象作為程序的基本單元,將程序和數(shù)據(jù)封裝其中,以提高軟件的重用性、靈活性和擴(kuò)展性。通過面向?qū)ο蟮姆绞剑瑢F(xiàn)實(shí)世界的事物抽象成對象,現(xiàn)實(shí)世界中的關(guān)系抽象成關(guān)聯(lián)、繼承、實(shí)現(xiàn)、依賴等關(guān)系,從而幫助人們實(shí)現(xiàn)對現(xiàn)實(shí)世界的抽象與建模。通過面向?qū)ο蟮姆椒ǎ谟萌巳菀桌斫獾姆绞?,對?fù)雜系統(tǒng)進(jìn)行分析、設(shè)計(jì)與開發(fā)。同時,面向?qū)ο笠材苡行岣呔幊痰男?,通過封裝技術(shù)和消息機(jī)制可以像搭積木一樣快速開發(fā)出一個全新的系統(tǒng)。4.1.1面向過程與面向?qū)ο罄纾何遄悠逵螒虻脑O(shè)計(jì)面向過程面向?qū)ο螅?)開始游戲,繪制基本畫面。(2)黑棋先走,繪制走完畫面。(3)判斷黑棋是否贏棋。(4)白棋走棋,繪制走完畫面。(5)判斷白棋是否贏棋。(6)返回步驟(2),繼續(xù)執(zhí)行。(7)輸出五子棋輸贏結(jié)果。五子棋系統(tǒng)系統(tǒng)運(yùn)作方式(1)棋盤部分:繪制畫面及展示雙方走棋;(2)黑棋、白棋:除顏色外,行為相同;(3)規(guī)則部分:判定輸贏和犯規(guī)。(1)首先棋盤部分先繪制基本畫面。(2)然后黑棋、白棋部分接受用戶輸入,執(zhí)行黑棋、白棋部分的行為,并告知棋盤部分。(3)棋盤部分接收黑棋、白棋部分的行為,繪制黑棋、白棋走完后的畫面。(4)棋盤部分發(fā)生變化后,規(guī)則部分對棋局進(jìn)行判定。4.1.1類和對象的概念姓名蔣某某性別女年齡23職業(yè)教師講課打卡批改作業(yè)輔導(dǎo)同學(xué)例如講授Java基礎(chǔ)課的蔣老師是一個對象,蔣老師具有的屬性包括姓名、性別、年齡、職業(yè)等,具有的行為包括講課、批改作業(yè)等。蔣老師開的小轎車也是一個對象,小轎車這個對象具有的屬性包括品牌、顏色、價格等,具有的行為包括行駛、停止、喇叭響等。4.1.1類和對象的概念

什么是類?類是對具有相同屬性和相同行為的對象的抽象。例如,班級中有學(xué)生王云、劉靜濤、南天華、雷靜,他們4個都是現(xiàn)實(shí)世界的學(xué)生對象,而學(xué)生這個角色是我們大腦中的抽象概念,是對這些類似對象進(jìn)行的抽象。在計(jì)算機(jī)世界里,學(xué)生就是類。通過學(xué)生這個類,可以創(chuàng)建出一個一個的對象,通常也稱為實(shí)例化出一個一個對象,如下圖所示。通過對王云、劉靜濤、南天華、雷靜這些現(xiàn)實(shí)世界學(xué)生對象的抽象,可以分析出學(xué)生這個類具有的屬性包括姓名、年齡、性別、年級等,方法包括聽課、寫作業(yè)等,如下圖所示。感謝觀看,下次再見類與對象應(yīng)用單元四類和對象概述Java類構(gòu)造方法目錄CONTENTS123對象初始化過程重載45繼承多態(tài)

78抽象和封裝

6抽象類接口

1011包和訪問控制

9目錄CONTENTS4.2Java類JavaAPI提供了一些現(xiàn)有的類,程序員可以使用這些類來創(chuàng)建對象,例如第5單元將要學(xué)習(xí)的String類。除了使用現(xiàn)有的Java類,程序員還可以自定義Java類,接下來會詳細(xì)地介紹如何定義和使用Java類。4.2.1Java類的定義在編寫第一個Java程序時就己經(jīng)知道,類是Java程序的基本單元。Java是面向?qū)ο蟮某绦蛟O(shè)計(jì)語言,所有程序都是由類組織起來的。下面是類定義的語法形式。

publicclass類名{ //定義類屬性

屬性1類型:屬性1名;

屬性2類型:屬性2名; ... //定義方法

方法1定義

方法2定義 ...}4.2.1Java類的定義例如:學(xué)生類的定義:publicclassStudent{ StringstuName;//學(xué)生姓名 intstuAge;//學(xué)生年齡 intstuSex;//學(xué)生性別 intstuGrade;//學(xué)生年級 //定義聽課的方法,在控制臺直接輸出 publicvoidlearn(){ System.out.println(stuName+"正在認(rèn)真聽課!"); } //定義寫作業(yè)的方法,輸入時間,返回字符串 publicStringdoHomework(inthour){ return"現(xiàn)在是北京時間:"+hour+"點(diǎn),"+stuName+"正在寫作業(yè)!"; }}

需要注意的是,這個類里面沒有main方法,所以只能編譯,不能運(yùn)行。4.2.2Java類的創(chuàng)建和使用定義好Student類后,就可以根據(jù)這個類創(chuàng)建(實(shí)例化)對象了。類就相當(dāng)于一個模板,可以創(chuàng)建多個對象。創(chuàng)建對象的語法形式如下。

類名

對象名=new類名();

創(chuàng)建對象時,要使用new關(guān)鍵字,后面要跟著類名。

根據(jù)上面創(chuàng)建對象的語法,創(chuàng)建王云這個學(xué)生對象的代碼如下。StudentwangYun=newStudent();

這里,只創(chuàng)建了wangYun這個對象,并沒有對這個對象的屬性賦值,考慮到每個對象的屬性值不一樣,所以通常在創(chuàng)建對象后給對象的屬性賦值。4.2.2Java類的創(chuàng)建和使用

在Java語言中,通過“.”操作符來引用對象的屬性和方法,具體的語法形式如下。

對象名.屬性;

對象名.方法;

通過上面的語法形式,可以給對象的屬性賦值,也可以更改對象屬性的值或者調(diào)用對象的方法,具體代碼如下所示: wangYun.stuName="王云"; wangYun.stuAge=22; wangYun.learn();//調(diào)用學(xué)生聽課的方法4.2.2Java類的創(chuàng)建和使用在編寫Java類時我們可以將類文件與主文件分開編寫,即編寫兩個Java文件,當(dāng)然也可以將兩個Java類寫在一個Java文件里,但其中只能有一個類用public修飾,并且這個Java文件的名稱必須用這個public類的類名命名。publicclassTestStudent{publicstaticvoidmam(String[]args){ //創(chuàng)建對象、調(diào)用屬性與方法}}classStudent//不能使用public修飾{ //屬性與方法的定義}在上面的一些例子中,對對象的屬性都是先賦值后再使用,如果沒有賦值就直接使用對象的屬性,會有什么樣的結(jié)果呢?4.2.2Java類的創(chuàng)建和使用Student

wangYun=new

Student();

//創(chuàng)建wangYun學(xué)生類對象System.out.println("未賦值前的學(xué)生姓名為:"+wangYun.stuName);System.out.println("未賦值前的學(xué)生年齡為:"+wangYun.stuAge);System.out.println("未賦值前的學(xué)生性別數(shù)值為:"+wangYun.stuSex);System.out.println("未賦值前的學(xué)生年級為:"+wangYun.stuGrade);//給對象的屬性賦值wangYun.stuName="王云";wangYun.stuAge=22;wangYun.stuSex=1;//1代表男,2代表女wangYun.stuGrade=4;//4代表大學(xué)四年級System.out.println("賦值后的學(xué)生姓名為:"+wangYun.stuName);System.out.println("賦值后的學(xué)生年齡為:"+wangYun.stuAge);System.out.println("賦斌值后的學(xué)生性別數(shù)值為:"+wangYun.stuSex);System.out.println("賦值后的學(xué)生年級為:"+wangYun.stuGrade);運(yùn)行結(jié)果在未給對象屬性賦值前使用屬性時,如果該屬性為引用數(shù)據(jù)類型,其初始默認(rèn)值為null,如果該屬性是int型,其初始默認(rèn)值為0。4.2.4封裝封裝就是將抽象得到的屬性和行為結(jié)合起來,形成一個有機(jī)的整體,就是類。類里面的一些屬性和方法(尤其是屬性),需要隱藏起來,不希望直接對外公開,但同時提供供外部訪問的方法來訪問這些需要隱藏的屬性和方法。封裝的目的是增強(qiáng)安全性和簡化編程,使用者不必了解具體類的內(nèi)部實(shí)現(xiàn)細(xì)節(jié),而只是要通過提供給外部訪問的方法,來有限制地訪問類需要隱藏的屬性和方法。感謝觀看,下次再見類與對象應(yīng)用單元四類和對象概述Java類構(gòu)造方法目錄CONTENTS123對象初始化過程重載45繼承多態(tài)

78抽象和封裝

6抽象類接口

1011包和訪問控制

9目錄CONTENTS4.3構(gòu)造方法在前面介紹封裝的時候,一旦給學(xué)生對象的性別賦值之后就不能修改的這個需求其實(shí)并沒有實(shí)現(xiàn),因?yàn)橥ㄟ^wangYun.setStuSex(1);方法給學(xué)生對象wangYun的stuSex屬性賦int型"1"這個值,之后仍然可以使用wangYun.setStuSex(2);方法將wangYun的stuSex屬性值從"1"改為"2",所以沒有實(shí)現(xiàn)一旦賦值之后就不能修改的需求。4.3.1構(gòu)造方法解決問題

因此在這里我們使用構(gòu)造方法解決該問題。為了實(shí)現(xiàn)一旦給學(xué)生對象的性別賦值之后就不能修改的功能,所以去掉了setStuSex(intsex)的方法,保證其他對象不能修改學(xué)生對象的性別。publicclassStudent{privateStringstuName;privateintstuAge;privateintstuSex;privateintstuGrade;//構(gòu)造方法,用戶初始化對象的成員變量publicStudent(Stringname,intage,intsex,intgrade){this.stuName=name;this.stuAge=age;this.stuSex=sex;this.stuGrade=grade;}//省略了Student類中的其他方法}4.3.2構(gòu)造方法的使用構(gòu)造方法(也稱為構(gòu)造函數(shù))是一種特殊的方法,它具有以下特點(diǎn)?!駱?gòu)造方法的方法名必須與類名相同?!駱?gòu)造方法沒有返回類型,也不能定義為void,在方法名前不聲明返回類型。因?yàn)镴ava設(shè)計(jì)人員把這種方法名(類名)和返回類型的類名相同的方法看成一個普通方法,只是名稱“碰巧”相同罷了,編譯器識別時也會認(rèn)為它是一個方法。為了和普通方法進(jìn)行區(qū)別,Java設(shè)計(jì)人員規(guī)定構(gòu)造方法不寫返回值,編譯器通過這一規(guī)定識別構(gòu)造方法,而不是說構(gòu)造方法真的沒有返回值。4.3.2構(gòu)造方法的使用構(gòu)造方法的主要作用是完成對象的初始化工作,它能夠把定義對象時的參數(shù)傳給對象。一個類可以定義多個構(gòu)造方法,根據(jù)參數(shù)的個數(shù)、類型或排列順序來區(qū)分不同的構(gòu)造方法。//構(gòu)造方法,用戶初始化對象的屬性(不帶年級參數(shù),設(shè)置年級默認(rèn)值為4)publicStudenl(Stringname,intage,intsex){this.stuName=name;this.stuAge=age;this.stuSex=sex;this.stuGrade=4;}//構(gòu)造方法,用戶初始化對象的屬性//不帶年齡、年級參數(shù),設(shè)置年齡默認(rèn)值為22,年級默認(rèn)值為4publicStudent(Stringname,intsex){this.stuName=name;this.stuAge=22;this.stuSex=sex;this.stuGrade=4;}//省略了Student類中的其他方法}publicclassStudent{privateStringstuName;privateintstuAge;privateintstuSex;privateintstuGrade;//構(gòu)造方法,用戶初始化對象的屬性publicStudent(Stringname,intage,intsex,intgrade){this.stuName=name;this.stuAge=age;this.stuSex=sex;this.stuGrade=grade;}4.3.2構(gòu)造方法的使用如果在定義類時沒有定義構(gòu)造方法,則編譯系統(tǒng)會自動插入一個無參數(shù)的默認(rèn)構(gòu)造方法,這個構(gòu)造方法不執(zhí)行任何代碼。如果在定義類時定義了有參的構(gòu)造方法,沒有顯式地定義無參的構(gòu)造方法,那么在使用構(gòu)造方法創(chuàng)建類對象時,則不能使用默認(rèn)的無參構(gòu)造方法。例如,在TestStudent6程序的main方法內(nèi)添加一行語句:StudentleiJing=newStudent();,編譯器會報錯,提示沒有找到無參的構(gòu)造方法。感謝觀看,下次再見類與對象應(yīng)用單元四類和對象概述Java類構(gòu)造方法目錄CONTENTS123對象初始化過程重載45繼承多態(tài)

78抽象和封裝

6抽象類接口

1011包和訪問控制

9目錄CONTENTS4.4對象初始化過程通過前面的學(xué)習(xí),知道類中的成員變量初始化有以下幾種情況?!駝?chuàng)建對象時默認(rèn)初始化成員變量。●定義類時,給成員變量賦初值?!裾{(diào)用構(gòu)造方法時,使用構(gòu)造方法所帶的參數(shù)初始化成員變量。在使用new關(guān)鍵字創(chuàng)建并初始化對象的過程中,具體的初始化分為4步。(1)給對象的實(shí)例變量分配空間,默認(rèn)初始化成員變量。(2)成員變量聲明時的初始化。(3)初始化塊初始化。(4)構(gòu)造方法初始化。4.4.1初始化塊初始化塊就是在類中用一對大括號括起來的代碼塊,語法形式如下:{代碼塊}

初始化塊可以用來初始化類的成員變量。但正如前面所說,使用初始化塊初始化成員變量的順序是在默認(rèn)初始化成員變量以及成員變量聲明時賦值之后,在使用構(gòu)造方法初始化之前。4.4.1初始化塊publicclassStudent{privateStringstuNarae="";privateintstuAge=-1;privateintstuSex=-1;privateintstuGrade=-1;//使用初始化塊初始化{System.out.println("使用初始化塊初始化");this.stuName="雷靜";this.stuAge=22;this.stuSex=2;this.stuGrade=4;}//無參構(gòu)造方法publicStudent(){System.out.println("使用無參構(gòu)造函數(shù)初始化");}//構(gòu)造方法,用戶初始化對象的成員變量publicStudent(Stringname,intage,intsex,intgrade){System.out.println("使用有參構(gòu)造函數(shù)初始化");this.stuName=name;this.stuAge=age;this.stuSex=sex;this.stuGrade=grade;}//省略了Student類中的其他方法}publicclassTestStudent7{publicstaticvoidmain(String[]args){Studenttemp=newStudent();System.out.println(temp.getStuName()+"正在讀大學(xué)"+

temp.getStuGrade()+"年級");//構(gòu)造方法初始化成員變量在初始化塊初始化之后StudentwangYun=newStudent("王云",22,1,4);System.out.println(wangYun.getStuName()+"正在讀大學(xué)"+

wangYun.getStuGrade()+“

年級");}}運(yùn)行結(jié)果4.4.2對象初始化內(nèi)存結(jié)構(gòu)代碼Studenttemp=newStudent("王云",22,1,4);運(yùn)行后,內(nèi)存結(jié)構(gòu)如圖所示。(1)給對象的實(shí)例變量分配空間,默認(rèn)初始化成員變量。(2)成員變量聲明時的初始化。(3)初始化塊初始化。(4)有參構(gòu)造函數(shù)初始化。感謝觀看,下次再見類與對象應(yīng)用單元四類和對象概述Java類構(gòu)造方法目錄CONTENTS123對象初始化過程重載45繼承多態(tài)

78抽象和封裝

6抽象類接口

1011包和訪問控制

9目錄CONTENTS4.5.1重載的定義在同一個類中,可以有兩個或兩個以上的方法具有相同的方法名,但它們的參數(shù)列表不同。在這種情況下,該方法就被稱為重載(overload)。其中參數(shù)列表不同包括以下3種情形:●參數(shù)的數(shù)量不同?!駞?shù)的類型不同。●參數(shù)的順序不同。必須要注意的是,僅返回值不同的方法不叫重載方法。且在編譯時會報錯4.5.2重載方法的使用在之前介紹一個類可以定義多個構(gòu)造方法的時候,己經(jīng)對構(gòu)造方法進(jìn)行了重載,接下來通過以下案例學(xué)習(xí)普通方法的重載。//省略了Student類中的其他方法//傳入?yún)?shù)name、age、sex和grade的值,輸出結(jié)果publicvoidlearn(Stringname,intage,intsex,intgrade){StringsexStr=(sex==l)?"男生":"女生";System.out.println(age+"歲的大學(xué)"+grade+"年級"+sexStr+name+"正在認(rèn)真聽課!");}//傳入?yún)?shù)name、age和sex的值,grade值取4,輸出結(jié)果publicvoidlearn(Stringname,intage,intsex){learn(name,age,sex,4);}//傳入?yún)?shù)name和sex的值,age的值取22,grade值取4,輸出結(jié)果publicvoidlearn(Stringname,intsex){leam(name,22,sex,4);}//無參的聽課方法,使用成員變量的值作為參數(shù)publicvoidlearn(){learn(this.stuName,this.stuAge,this.stuSex,this.stuGrade);}}publicclassStudent{privateStringstuName;privateintstuAge;privateintstuSex;privateintstuGrade;//構(gòu)造方法,用戶初始化對象的屬性publicStudent(Stringname,intage,intsex,intgrade){this.stuName=name;this.stuAge=age;this.stuSex=sex;this.stuGrade=grade;}//構(gòu)造方法,用戶初始化對象的屬性(不帶年級參數(shù),設(shè)置年級默認(rèn)值為4)publicStudent(Stringname,intage,intsex){this.stuName=name;this.stuAge=age;this.stuSex=sex;this.stuGrade=4;}//構(gòu)造方法,用戶初始化對象的屬性//不帶年齡、年級參數(shù),設(shè)置年齡默認(rèn)值為22,年級默認(rèn)值為4publicStudent(Stringname,intsex){this.stuName=name;this.stuAge=22;this.stuSex=sex;this.stuGrade=4;}//無參構(gòu)造方法publicStudent(){}4.5.2重載方法的使用前面的代碼重載了learn方法,測試類main方法中的代碼如下:Studentstu=newStudent("王云",22,1,4);stu.learn("劉靜濤",21,2,3);stu.learn("南天華",20,1);stu.learn("雷靜",2);stu.learn();運(yùn)行結(jié)果有些人可能已經(jīng)注意到了,在一些重載方法的方法體內(nèi),調(diào)用了其他重載方法。這種情況在類重載方法的使用上非常普遍,有利于代碼的重用和維護(hù)。感謝觀看,下次再見類與對象應(yīng)用單元四類和對象概述Java類構(gòu)造方法目錄CONTENTS123對象初始化過程重載45繼承多態(tài)

78抽象和封裝

6抽象類接口

1011包和訪問控制

9目錄CONTENTS4.6抽象和封裝面向?qū)ο笤O(shè)計(jì)首先要做的就是抽象。根據(jù)用戶的業(yè)務(wù)需求抽象出類,并關(guān)注這些類的屬性和方法,將現(xiàn)實(shí)世界中的對象抽象成程序設(shè)計(jì)中的類。接下來分析一下“租車系統(tǒng)”的部分需求。(1)在控制臺輸出“請選擇要租車的類型:(1代表轎車,2代表卡車)”,等待用戶輸入。(2)如果用戶選擇的是轎車,則在控制臺輸出“請選擇轎車品牌:(1代表紅旗,2代表長城)”,等待用戶輸入。(3)如果用戶選擇的是卡車,則在控制臺輸出“請選擇卡車噸位:(1代表5噸,2代表10噸)”,等待用戶輸入。(4)在控制臺輸出“請給所租的車起名:”,等待用戶輸入車名。(5)所租的車油量默認(rèn)值為20升,車輛損耗度為0(表示剛保養(yǎng)完的車,無損耗)。(6)具有顯示所租車輛信息功能,顯示的信息包括:車名、品牌/噸位、油量和車損度。4.6.1類抽象首先要進(jìn)行類抽象,就是發(fā)現(xiàn)類并定義類的屬性和方法。(1)發(fā)現(xiàn)名詞;(2)確定類和屬性;(3)確定方法。轎車類圖卡車類圖4.6.2類封裝類抽象的目的在于抽象出類,并確定屬性和方法,而接下來的類封裝,則要在封裝的角度隱藏類的屬性,提供公有的方法來訪問這些屬性。最簡單的操作方法就是,把所有的屬性都設(shè)置為私有屬性(表示私有屬性和方法時,需在類圖中的屬性和方法前加上“-”號),每個私有屬性都提供getter和setter公有的方法(表示公有屬性和方法時,需在類圖中的屬性和方法前加上“+”號),最終可得到封裝后的類圖:

轎車類圖卡車類圖4.6.2類封裝這樣的封裝過于簡單,沒有考慮需求,接下來進(jìn)一步閱讀需求,可以發(fā)現(xiàn)以下幾點(diǎn)。

(1)租車時可以指定車的類型和品牌(或噸位),之后不允許修改。(2)油量和車損度租車時取默認(rèn)值,只有通過車的加油和行駛的行為改變其油量和車損度值,不允許直接修改。根據(jù)需求,應(yīng)對轎車類和卡車類做如下修改:(1)去掉所有的setter方法,保留所有的getter方法。(2)提供addOil()、drive()這兩個公有的方法,實(shí)現(xiàn)車的加油和行駛的行為。(3)至少需要提供一個構(gòu)造方法,實(shí)現(xiàn)對類型和品牌(或噸位)的初始化。4.6.3方法的實(shí)現(xiàn)在Car類和Truck類的代碼中,addOil()方法和drive()方法的功能還沒有實(shí)現(xiàn),接下來結(jié)合需求,分別完成Car類和Truck類中的這兩個方法。《租車系統(tǒng)》增加了如下需求:(1)不論是轎車還是卡車,油箱最多可以裝60升汽油,每次給車加油,增加油量20升。如果加油20升超過油箱容量時,則加到60升即可,并在控制臺輸出“油箱己加滿!”。(2)汽車行駛1次,耗油5升,車損度增加10,如果油量低于10升,則不允許行駛,直接在控制臺輸出“油量不足10升,需要加油!”。importjava.util.Scanner;importorg.unitthree.*;classTestZuChe2{publicstaticvoidmain(String[]args){Carcar=newCar("戰(zhàn)神","長城");//初始化轎車對象carcar.show(); //輸出車輛信息car.drive(); //讓car行駛1次,油量剩下15升,車損度為10car.show(); //輸出車輛信息car.drive(); //讓car再行駛1次,油量剩下10升,車損度為20car.drive(); //讓car再行駛1次,油量剩下5升,車損度為30car.drive(); //讓car再行駛1次,因油量不足10升,不行駛,提示需要加油car.addOil(); //讓car加油1次,油量增加20升,達(dá)到25升car.show(); //輸出車輛信息}}//加油publicvoidaddOil(){if(oil>40) //如果加油20升則超過油箱容量,則加到60升即可{oil=60;System.out.println("郵箱已加滿!");}else{ //加油20升oil=oil+20;}System.out.println("加油完成!");}//行駛publicvoiddrive(){if(oil<10){System.out.println("油量不足10升,需要加油!");}else{System.out.println("正在行駛!");oil=oil-5;loss=loss+10;}}示例代碼:測試類中運(yùn)行結(jié)果:4.6.3方法的實(shí)現(xiàn)感謝觀看,下次再見類與對象應(yīng)用單元四類和對象概述Java類構(gòu)造方法目錄CONTENTS123對象初始化過程重載45繼承多態(tài)

78抽象和封裝

6抽象類接口

1011包和訪問控制

9目錄CONTENTS4.7.1繼承的概念在前面的課程中,根據(jù)《租車系統(tǒng)》的需求抽象出了Car類和Truck類,在這兩個類中有許多相同的屬性和方法,例如name、oil、loss屬性以及相應(yīng)的getter方法,還有addOil()和drive()方法。這樣做有兩個問題,一是代碼大量重復(fù),二是如果要修改,兩個類都要修改,會很麻煩,而且容易忘記修改部分內(nèi)容。Java繼承是使用己存在的類的定義作為基礎(chǔ)建立新類的技術(shù),新類的定義可以增加新的屬性或新的方法,也可以用已存在的類的屬性和方法。這種技術(shù)能夠非常容易地復(fù)用以前的代碼,大大縮短開發(fā)周期,降低開發(fā)費(fèi)用。4.7.1繼承的概念繼承的語法形式如下:classAextendsB{類定義部分}即A類繼承B類,B類稱為父類、超類或基類,A類稱為子類、衍生類或?qū)С鲱悺?.7.2繼承的使用了解Java繼承的概念后,接下來使用繼承來解決Car類和Truck類重復(fù)代碼的問題。作為程序設(shè)計(jì)人員,可以將Car類和Truck類重復(fù)的代碼挑出來,提取到一個單獨(dú)的Vehicle類中,然后讓Car類和Truck類繼承Vehicle類,這樣可以在保留Vehicle類的屬性和方法的同時,增加不同的屬性和方法??傻美^承的類圖:根據(jù)圖可編寫Vehicle類,Car類和Truck類。4.7.3繼承的訪問權(quán)限繼承最大的好處是,子類可以從父類中繼承屬性和方法,那么子類是不是能繼承父類所有的屬性和方法呢?具體情況說明如下?!?/p>

子類可以繼承父類中訪問權(quán)限修飾符為public和protected的屬性和方法?!?/p>

子類可以繼承父類中用默認(rèn)訪問權(quán)限修飾的屬性和方法,但子類和父類必須在同一個包中?!?/p>

子類無法繼承父類中訪問權(quán)限修飾符為private的屬性和方法?!?/p>

子類無法繼承父類的構(gòu)造方法。4.7.4方法的重寫子類可以從父類繼承相應(yīng)訪問權(quán)限的方法,但如果父類的方法不能滿足子類的需要,則可以在子類中對父類的同名方法進(jìn)行覆蓋,這就是重寫。假設(shè)《租車系統(tǒng)》中,系統(tǒng)的需求發(fā)生了如下變化:卡車每行駛1次,耗油從5升提升為10升,增加車損度10,如果油量低于15升,則不允許行駛,直接在控制臺輸出“油量不足15升,需要加油!”在此情況下可以通過重寫解決。4.7.4方法的重寫在Truck類中添加如下的代碼,重寫父類的drive()方法。//子類重寫父類的drive()方法publicvoiddrive(){if(oil<15){System.out.println("油量不足15升,需要加油!");}else{System.out.println("正在行駛!");oil=oil-10;loss=loss+10;}}4.7.4方法的重寫重寫需要滿足的條件●重寫方法與被重寫方法同名,參數(shù)列表也必須相同。●重寫方法的返回值類型必須和被重寫方法的返回值類型相同或是其子類?!裰貙懛椒ú荒芸s小被重寫方法的訪問權(quán)限。4.7.5屬性的覆蓋創(chuàng)建父類對象,實(shí)現(xiàn)的時候用子類實(shí)現(xiàn),此時這個對象的屬性為父類的屬性,不被子類覆蓋。父類的方法被子類覆蓋,調(diào)用了子類重寫的方法,顯示出“子類方法”。publicclassSubextendsSuper{publicinti=100; //子類同名屬性i,賦值100publicstaticvoidmain(String[]args){Supersup=newSub(); //創(chuàng)建父類對象,用子類實(shí)現(xiàn)System.out.println(sup.i);//輸出sup的i屬性}}classSuper{publicinti=50; //父類屬性i,賦值50}publicclassSubextendsSuper{publicinti=100;publicvoidshow() //子類方法重寫,顯示“子類方法”{System.out.println("子類方法");}publicstaticvoidmain(String[]args){Supersup=newSub(); //創(chuàng)建父類對象,用子類實(shí)現(xiàn)sup.show(); //調(diào)用的是子類方法,覆蓋了父類方法System.out.println(sup.i);}}classSuper{publicinti=50;publicvoidshow() //父類方法,顯示“父類方法”{System.out.println("父類方法");}}4.7.6繼承中的初始化在第一次實(shí)例化子類時,先調(diào)用父類的靜態(tài)塊,再調(diào)用子類的靜態(tài)塊,之后再調(diào)用父類的非靜態(tài)塊和構(gòu)造方法,再調(diào)用子類的非靜態(tài)塊和構(gòu)造方法。注意,當(dāng)?shù)诙螌?shí)例化子類時,父類和子類的靜態(tài)塊都不會再被調(diào)用,因?yàn)樗鼈兪庆o態(tài)塊,屬于類級別的,只會被調(diào)用一次。publicclassInitDemo{publicstaticvoidmain(String[]args){System.out.println("第一次實(shí)例化子類:");newSub();System.out.println("第二次實(shí)例化子類:");newSub();}}classSuper{static{System.out.println("顯示:父類中的靜態(tài)塊!");}{System.out.println("顯示:父類中的非靜態(tài)塊!");}Super(){System.out.println("顯示:父類構(gòu)造方法!");}}classSubextendsSuper{static{System.out.println("顯示:子類中的靜態(tài)塊!");}{System.out.println("顯示:子類中的非靜態(tài)塊!");}Sub(){System.out.println("顯示:子類構(gòu)造方法!");}}感謝觀看,下次再見類與對象應(yīng)用單元四類和對象概述Java類構(gòu)造方法目錄CONTENTS123對象初始化過程重載45繼承多態(tài)

78抽象和封裝

6抽象類接口

1011包和訪問控制

9目錄CONTENTS4.8.1向上轉(zhuǎn)型把對某個對象的引用看作其父類對象的引用的做法稱為向上轉(zhuǎn)型。即父類對象的引用指向子類對象。父類Vehicle子類Car//駕駛員獲取車輛信息,輸入?yún)?shù)為車對象publicvoidcallShow(Vehiclev){v.show();}向上轉(zhuǎn)型的應(yīng)用當(dāng)需要獲取車輛信息時,無論傳入的參數(shù)是轎車對象或者卡車對象,在這里都會將其轉(zhuǎn)換為其父類Vehicle對象。并且調(diào)用的show()方法都是對應(yīng)子類重寫的show()方法。4.8.1向上轉(zhuǎn)型向上轉(zhuǎn)型雖然可以減少代碼量增加程序的可擴(kuò)展性,但需要注意以下幾點(diǎn):1、可以直接訪問子類重寫方法;

2、不能直接訪問子類私有方法、子類所有屬性;

3、可以通過重寫方法調(diào)用子類私有方法和屬性;

4、重寫方法中調(diào)用方法和屬性順序:子類->父類。4.8.2向下轉(zhuǎn)型向下轉(zhuǎn)型則與向上轉(zhuǎn)型相反,子類引用指向父類對象。也就是說可能明明需要一個Car類引用,卻提供了一個Vehicle類的對象。顯然,這樣的做法是不安全的。并且不是所有的對象都可以向下轉(zhuǎn)型,只有這個對象原本是子類對象通過向上轉(zhuǎn)型得到的時候才能成功的向下轉(zhuǎn)型。因此在對對象的強(qiáng)制類型轉(zhuǎn)換時,不知道會不會拋出異常,因此可通過instanceof運(yùn)算符(不是方法),可以進(jìn)行類型判斷,避免拋出異常。importorg.unitthree.*;classTestZuChe7{publicstaticvoidmain(String[]args){//Vehiclev=newCar("戰(zhàn)神","長城"); //聲明父類對象,實(shí)例化出子類對象Vehiclev=newTruck("大力士二代","10噸");v.show();if(vinstanceofCar) //對象v屬于Car類型{Carcar=(Car)v; //將對象v強(qiáng)制類型轉(zhuǎn)換成Car類對象System.out.println(car.getBrand());//調(diào)用Car類的特有方法getBrand()}else{ //對象v不屬于Car類型Trucktruck=(Truck)v; //將對象v強(qiáng)制類型較換成Truck類對象System.out.println(truck.getLoad()); //調(diào)用Truck類的特有方法getLoad()}}}拋出異常實(shí)例代碼感謝觀看,下次再見類與對象應(yīng)用單元四類和對象概述Java類構(gòu)造方法目錄CONTENTS123對象初始化過程重載45繼承多態(tài)

78抽象和封裝

6抽象類接口

1011包和訪問控制

9目錄CONTENTS4.9.1Java包程序員可以使用package關(guān)鍵字指明源文件中的類屬于哪個具體的包,包的語法形式如下:packagepkg1[.pkg2[.pkg3...]];程序中如果有package語句,該語句一定是源文件中的第一條可執(zhí)行語句,它的前面只能有注釋或空行。另外,一個文件中最多只能有一條package語句。packageone.two.test; //聲明包publicclassTestPackage{publicstaticvoidmain(String[]args){System.out.println("packagecom.bd.test");}}示例代碼包結(jié)構(gòu)4.9.1Java包JDK的類庫被分成許多包,這些包是分層次組織的,就像在硬盤上嵌套有各級子目錄一樣。最高一級的包名是

java

javax

,其下一級的包名有l(wèi)ang、util、net、io等,如下圖所示:JDK包結(jié)構(gòu)4.9.1Java包下面簡要介紹JDK類庫中不同包的主要功能:●java.lang:提供利用Java編程語言進(jìn)行程序開發(fā)的基礎(chǔ)類,例如String、Math、Integer、System和Thread等。●java.util:Java工具類,包含對集合的操作、事件模型、日期和時間設(shè)置、國際化和各種實(shí)用工具類?!駄ava.io:通過數(shù)據(jù)流、序列化和文件系統(tǒng)提供系統(tǒng)輸入和輸出?!瘢簽閷?shí)現(xiàn)網(wǎng)絡(luò)應(yīng)用程序而提供的類?!駄ava.awt:包含用于創(chuàng)建用戶界面和繪制圖形圖像的類。4.9.2引用包當(dāng)使用的類不在當(dāng)前目錄下時,不能對類進(jìn)行引用,常見解決辦法如下:●完整類名引用類:使用完整類名com.bd.test.TestPackagetp=newcom.bd.test.TestPackage();●導(dǎo)入包:import包名.類名;//這里的包名可以是自定義或公共的importcom.bd.test.*; //導(dǎo)入com.bd.test中所有的公共類classTestImport5{publicstaticvoidmain(String[]args){TestPackagetp=newTestPackage(); //直接使用導(dǎo)入的類tp.show();}

}4.9.3訪問權(quán)限Java語言中的訪問權(quán)限修飾符有4種,但卻只有3個關(guān)鍵字。因?yàn)椴粚懺L問權(quán)限修飾符時,在Java中被稱為默認(rèn)權(quán)限(包權(quán)限),本教材中以default代替。其他3個訪問權(quán)限修飾符分別為private、protected和public。修飾符類內(nèi)部同一個包中子類任何地方privateYes

defaultYesYes

protectedYesYesYes

publicYesYesYesYes訪問權(quán)限修飾符總結(jié)4.9.4static包聲明為static的變量稱為靜態(tài)變量或類變量。聲明為static的方法稱為靜態(tài)方法或類方法。

可以直接通過類名引用靜態(tài)變量,也可以通過實(shí)例名來引用靜態(tài)變量,靜態(tài)變量是跟類相關(guān)聯(lián)的,類的所有實(shí)例共同擁有一個靜態(tài)變量。

靜態(tài)方法可以直接調(diào)用靜態(tài)方法,訪問靜態(tài)變量,但是不能直接訪問實(shí)例變量和實(shí)例方法。靜態(tài)方法中不能使用this關(guān)鍵字,因?yàn)殪o態(tài)方法不屬于任何一個實(shí)例。4.9.4static包

靜態(tài)塊的語法形式如下:static{

語句塊}Java類首次裝入Java虛擬機(jī)時,會對靜態(tài)變量(含靜態(tài)塊)或方法進(jìn)行一次初始化,方法不被調(diào)用是不會執(zhí)行的,就是說靜態(tài)變量和靜態(tài)塊是在類首次裝載進(jìn)Java虛擬機(jī)時被執(zhí)行的。感謝觀看,下次再見類與對象應(yīng)用單元四類和對象概述Java類構(gòu)造方法目錄CONTENTS123對象初始化過程重載45繼承多態(tài)

78抽象和封裝

6抽象類接口

1011包和訪問控制

9目錄CONTENTS4.10抽象類在面向?qū)ο蟮氖澜缋?,所有的對象都是通過類來實(shí)例化的,但并不是所有的類都是直接用來實(shí)例化對象的。如果一個類中沒有包含足夠的信息來描繪一個具體的事務(wù),這樣的類可以形成抽象類。抽象類往往用來表示在對事務(wù)進(jìn)行分析、設(shè)計(jì)后得出的抽象概念,是對一系列看上去不同,但是本質(zhì)上相同的具體概念的抽象。4.10.1抽象類的概念Java中提供了一種專門供子類來繼承的類,這個類就是抽象類,其語法形式如下:abstractclass類名{}Java也提供了一種特殊的方法,這個方法不是一個完整的方法,只含有方法的聲明,沒有方法體,這樣的方法叫做抽象方法,其語法形式如下:其他修飾符

abstract返回值

方法名();4.10.2抽象類的使用現(xiàn)有Person類、Chinese類和American類三個類,其中Person類為抽象類,含有eat()和work()兩個抽象方法,其類關(guān)系如圖所示。抽象類之間的類圖關(guān)系4.10.3抽象類的特征抽象類為什么不能被直接實(shí)例化?1.從Java規(guī)范:Java程序中規(guī)定了抽象類不能實(shí)例化。強(qiáng)行實(shí)例化就會報錯。2.從功能角度:抽象類是一個結(jié)構(gòu)和功能“不完整”的類,如果你讓他強(qiáng)行“出生”的話,它可能會患有各種疾病,所以我們不能直接進(jìn)行實(shí)例化,需要通過子類對結(jié)構(gòu)和功能進(jìn)行補(bǔ)全才能讓它健康出生。3.從內(nèi)存分配角度:抽象類只在分配了在棧中的引用,沒有分配堆中的內(nèi)存。程序都有一個代碼段,在內(nèi)存中需要占據(jù)一定的內(nèi)存,而抽象類沒有具體的實(shí)現(xiàn)方法,無法具體的給它分配內(nèi)存空間,所以為了安全,不JAVA不允許抽象類,接口直接實(shí)例化。感謝觀看,下次再見類與對象應(yīng)用單元四類和對象概述Java類構(gòu)造方法目錄CONTENTS123對象初始化過程重載45繼承多態(tài)

78抽象和封裝

6抽象類接口

1011包和訪問控制

9目錄CONTENTS4.11.1接口的概念如果抽象類中的方法都是抽象方法,那么由這些抽象方法組成的特殊的抽象類就是接口。抽象類更側(cè)重于對相似的類進(jìn)行抽象,形成抽象的父類以供子類繼承使用,而接口往往在程序設(shè)計(jì)的時候,定義模塊與模塊之間應(yīng)滿足的規(guī)約,使各模塊之間能協(xié)調(diào)工作。Java接口定義的語法形式如下:[修飾符]interface接口名[extends][接口列表]{接口體}類實(shí)現(xiàn)接口的語法形式如下:[類修飾符]class類名implements接口列表{類體}4.11.2接口的使用(1)定義電子郵件接口。publicinterfaceEmailInterface{//設(shè)置發(fā)信者郵箱publicvoidsetSendAdd(Stringadd);//設(shè)置收信者郵箱publicvoidsetReceiveAdd(Stringadd);//設(shè)置郵件主題publicvoidsetEmailTitle(Stringtitle);//設(shè)置郵件內(nèi)容publicvoidwriteEmail(Stri

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論