Java程序設計基礎 課件 第6章 OOP-p1_第1頁
Java程序設計基礎 課件 第6章 OOP-p1_第2頁
Java程序設計基礎 課件 第6章 OOP-p1_第3頁
Java程序設計基礎 課件 第6章 OOP-p1_第4頁
Java程序設計基礎 課件 第6章 OOP-p1_第5頁
已閱讀5頁,還剩144頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第6章面向對象程序設計(上)1教學目標(1) 理解面向過程抽象與面向對象抽象(2) 理解面向對象三大特征(3) 理解類與對象的關系,能夠定義類、創建對象和訪問對象成員(4) 理解UML類圖(5) 理解靜態成員概念,能使用靜態成員(6) 理解模塊、包、public、private等對訪問權限的影響(7) 理解數據域封裝(8) 理解變量作用域(9) 理解和應用對象作為方法參數和作為方法返回值,能使用var定義局部變量。(10) 理解對象數組,能使用對象數組(11) 理解this關鍵字的含義,能使用this引用隱藏數據域和調用構造方法(12) 能使用基本數據類型包裝類、BigInteger類、BigDecimal類、Date類2動機在信息技術發展過程中,早期的軟件規模較小,面向過程的軟件開發方法就能很好地解決。隨著,軟件規模越來越大,問題越來越復雜,面向過程的軟件開發方法不足以應對大規模和復雜性高的軟件系統開發。面向過程的編程是對任務的過程分解,解決問題的思路是“走一步,看一步,遇到問題,解決問題”。面向對象解決問題并不關心問題處理過程,而是關注解決問題過程中都有哪些對象參與,給參與的對象分配相應的職責即可。3引入面向對象程序設計!!!內容46.1面向對象概述6.2類與對象6.3靜態成員6.4可見性修飾符6.5數據域封裝6.6變量作用域6.7對象與方法6.8對象數組6.9ArrayList6.10this引用6.11Java常用類內容56.1面向對象概述6.2類與對象6.3靜態成員6.4可見性修飾符6.5數據域封裝6.6變量作用域6.7對象與方法6.8對象數組6.9ArrayList6.10this引用6.11Java常用類6.1面向對象概述面向對象(ObjectOriented,簡稱OO)是一種軟件開發方法,也是一種編程范式,還是一種對現實世界進行理解和抽象的方法把相關的數據和方法封裝成一個整體,以更加自然的方式對現實世界進行建模三大特征:封裝繼承多態66.1面向對象概述76.1.1面向過程與面向對象的抽象6.1.2封裝6.1.3繼承6.1.4多態6.1面向對象概述86.1.1面向過程與面向對象的抽象6.1.2封裝6.1.3繼承6.1.4多態6.1.1面向過程與面向對象的抽象抽象:透過事物的表面現象抽取事物本質特征,同時舍棄事物非本質特征的過程面向過程的抽象功能分解數據和過程是分離的,兩者關系由程序員維護多個過程可能修改和使用同一數據96.1.1面向過程與面向對象的抽象人類觀察現實世界時,會把現實世界的事物分為一個個實體,每個實體能做什么,它和其他實體協作做了什么,從而理解現實世界的運作。面向對象抽象從現實世界問題域抽象出一個個相互獨立的對象,表示現實世界的實體,弄清楚每個實體具有什么屬性,具有哪些動態特征,會與哪些實體進行交互等面向對象抽象將數據和操作封裝到一個個能動的對象中,數據和操作之間的對應關系不再由程序員來維護,而由系統自動維護106.1.1面向過程與面向對象的抽象復雜性解決:在面向對象系統中,一些獨立的對象依據某種構造結合在一起,能形成新的、特有的屬性和功能,可以形成一個更大更復雜的對象。這個更大更復雜的對象也可以成為另一個更大對象的一個組成部分,從而構造出一個更為龐大的系統例:一輛汽車一般由發動機、底盤、車身、電氣設備等組成,而一個發動機、一個底盤、一個車身、一個電氣設備等本身也是一個對象,它們裝配在一起可以形成更為復雜、具有獨特功能的一個汽車對象116.1.1面向過程與面向對象的抽象三大特征:封裝性:從對象的外部來看,除了它用來與外界進行交互的接口之外,對象內部就是一個黑匣子,外部看不到對象的實現細節繼承性:對象可以衍生出后代,后代對象將擁有父輩的全部能力多態性:一個對象變量在程序運行的不同時刻可以具有多種不同形態,即指向不同類型的對象,從而具有不同的功能12136-1面向對象的特征不包括()封裝性繼承性多樣性多態性ABCD提交單選題1分6.1面向對象概述146.1.1面向過程與面向對象的抽象6.1.2封裝6.1.3繼承6.1.4多態6.1.2封裝封裝(Encapsulation):把從現實世界中抽象出來的客觀實體封裝成類,并且類可以隱藏自己內部的實現細節,讓外界不可見,并把需要提供給外界的接口向外發布封裝體現了信息隱藏(informationhiding)在程序設計中,類(class)是創建對象的模板,是一組對象公共屬性和行為的抽象。一個類的實例就是該類的一個對象在抽象一組對象(屬于某一類)的公共屬性和行為時,要考慮現實世界問題域。大學生對象在不同的問題域中屬性和行為是不一樣的當問題域是高校教務管理系統時,大學生對象的屬性可以包括:學號、姓名、年齡、籍貫、入學年份、專業、學分績、已修課程等,其行為可以包括:查詢學號、查詢專業、查詢學分績、轉專業、選課、退課、退學等當問題域是高校財務管理系統時,大學生對象的屬性可以包括:學號、姓名、當前應繳費用、是否繳納、歷史繳費記錄等,其行為可以包括:查詢應繳費用清單、查詢繳費狀態、查詢歷史繳費記錄、生成當前繳費收據等156.1面向對象概述166.1.1面向過程與面向對象的抽象6.1.2封裝6.1.3繼承6.1.4多態6.1.3繼承繼承(Inheritance)是指一個類可以無需重新編寫現有類的代碼而具備現有類的所有功能,并在此基礎上可以擴展通過繼承所創建的新類被稱為“派生類”、“子類”、“擴展類”被繼承的類被稱為“基類”、“父類”、“超類”繼承體現了現實世界的分類體系,表達了“是一種”關系,符合人類的思維方式繼承可以分為單繼承和多繼承。單繼承就是一個類只有一個直接父類。而多繼承是指一個類有多個直接父類。Java語言是單繼承語言,C++語言是多繼承語言176.1.3繼承繼承(Inheritance)是指一個類可以無需重新編寫現有類的代碼而具備現有類的所有功能,并在此基礎上可以擴展186.1面向對象概述196.1.1面向過程與面向對象的抽象6.1.2封裝6.1.3繼承6.1.4多態6.1.4多態多態(Polymorphism)是指一個對象引用變量在程序運行的不同時刻具有多種形態具體來講,就是一個父類類型的引用變量能夠指向其任何不同子類的一個實例,從而表現出相應子類實例的行為。假設定義了一個引用變量vehicle指向一個交通工具類,該引用變量可以在程序運行的某個時刻指向陸地交通工具類的一個實例,也可以指向水上交通工具類或空中交通工具類的一個實例,還可以指向火車類、汽車類等的一個實例當一個方法的形式參數是交通工具類對象時,那么該方法可以接受的實際參數可以是其任一子類的對象。這樣,相同的方法可以接受不同類型的參數,表現出不同的行為。換句話說,這就是同一操作作用于不同類的實例,產生不同的執行結果。這也是多態性的一種外在表現。20內容216.1面向對象概述6.2類與對象6.3靜態成員6.4可見性修飾符6.5數據域封裝6.6變量作用域6.7對象與方法6.8對象數組6.9ArrayList6.10this引用6.11Java常用類6.2類與對象對象(Object):代表現實世界問題域中可明確標識的一個實體。客觀存在的事物,如:一個學生、一輛小轎車等。抽象事件,如一場比賽、一次會議等每個對象都有自己獨特的標識、狀態、行為。對象標識(又稱為對象ID):是程序中唯一標識一個對象的有效標識符對象屬性(state,又稱為特征或狀態):由具有當前值的數據域來表示的。如一個矩形對象的數據域:寬度width為5.5和高度height為7.5,它們描述了該矩形對象的當前屬性或狀態對象行為(behavior,亦稱為對象操作):對象操作體現了對象的能動性和功能,在程序設計語言中,對象操作由方法(或函數)來定義。如矩形對象:getArea()、getPerimeter()。類(class):一組具有相同屬性和行為的對象的抽象。類是創建對象的模板。226.2.1類的定義6.2.2對象創建6.2.3對象訪問6.2類與對象類是一個模板,用來定義一組相同類型對象具有的屬性和行為。一個對象是類的一個實例(instance),對象和實例具有相同含義創建實例的過程稱為實例化(Instantiation)類的定義包括:屬性(數據域):用變量定義,成員變量行為(動作):用方法定義,成員方法構造方法:用于創建與初始化一個對象類定義一般形式236.2.1類的定義6.2.2對象創建6.2.3對象訪問6.2類與對象示例:程序清單6-1SimpleRect.java246.2.1類的定義6.2.2對象創建6.2.3對象訪問在面向對象分析和設計過程中,程序員可以使用UML(UnifiedModellingLanguage,統一建模語言)的圖形符號進行建模,協助程序員進行可視化分析256-2()表示一個在真實世界中能被明確區分的實體。一個類一個對象一個方法一個數據域ABCD提交單選題1分6.2類與對象對象可以先聲明后創建,聲明的一般形式是:類名對象名;創建對象的一般形式是:對象名=new類名(實參列表);對象的聲明和創建也可以結合在一起,其一般形式是:類名對象名=new類名(實參列表);示例:266.2.1類的定義6.2.2對象創建6.2.3對象訪問SimpleRectrect1;rect1=newSimpleRect(3.5,4.5);SimpleRectrect1=newSimpleRect(3.5,4.5);6.2類與對象對象的創建涉及引用類型、構造方法、數據域默認值1、引用類型用戶定義的類是一種用戶自定義的數據類型,也是一種引用類型(referencetype)。引用類型的變量是一個合法的標識符,被稱為對象引用變量(referencevariable),也被稱為對象名。對象實體:‘new構造方法’在內存堆中為新創建的對象分配一塊內存并初始化該對象的數據域,這個初始化之后的內存塊被稱為對象實體。276.2.1類的定義6.2.2對象創建6.2.3對象訪問引用類型變量代表的內存位置存儲的值是一個引用值基本數據類型變量代表的內存位置存儲的值是基本類型的值6.2類與對象286.2.1類的定義6.2.2對象創建6.2.3對象訪問基本類型變量賦值將一個基本數據類型變量a賦給另一個基本數據類型變量b時,即b=a,可以直接將a的值賦給b。例如,假設已知i為2,j為0,執行j=i,這時,直接將i的值2賦給j,j也變為2賦值前賦值后6.2類與對象296.2.1類的定義6.2.2對象創建6.2.3對象訪問引用變量賦值6.2類與對象2、構造方法(1)構造方法必須與所在類同名,大小寫一致。(2)構造方法沒有返回值類型,也不能加void關鍵字。(3)構造方法只能在創建一個對象時由關鍵字new調用。構造方法允許重載,可以有多個同名但是方法簽名不一樣的構造方法。示例:程序清單6-1SimpleRect.java通常,一個類會提供一個沒有形式參數的構造方法(例如:SimpleRect()),這樣的構造方法被稱為無參構造方法。306.2.1類的定義6.2.2對象創建6.2.3對象訪問316-3以下有關構造方法的說法,正確的是:()一個類的構造方法可以有多個構造方法在類聲明時被調用構造方法只能由對象中的其它方法調用。構造方法可以和類同名,也可以和類名不同ABCD提交單選題1分6.2類與對象提問:如果一個類沒有定義構造方法,那么能不能創建該類的對象呢?能。這是因為Java編譯器對源程序進行編譯后,會給一個沒有明確定義任何構造方法的類自動提供一個默認構造方法(defaultconstructor)。默認構造方法是一個方法體為空的無參構造方法當一個類明確定義了一個或多個構造方法時,默認構造方法就不再被自動提供326.2.1類的定義6.2.2對象創建6.2.3對象訪問6.2類與對象3、數據域默認值當一個類通過默認構造方法(方法體為空)創建對象時,該類的數據域是如何初始化的?在Java語言中,一個類的數據域是有默認值的。數值類型數據域的默認值是零值布爾類型數據域的默認值是false字符類型數據域的默認值是\u0000引用類型數據域的默認值是null示例:程序清單6-2Person.java、程序清單6-3TestPerson.java對象成員訪問操作符(objectmemberaccessoperator),通過“對象名.成員變量”的方式訪問person對象的各個數據域,得到其默認值。336.2.1類的定義6.2.2對象創建6.2.3對象訪問6.2類與對象在對象創建之后,每個對象具有自己的數據域,可以通過對象成員訪問操作符.來訪問對象自身的數據域和調用方法,對象成員訪問操作符使用的一般形式是:對象引用變量.數據域;對象引用變量.方法(實參列表);示例:程序清單6-4TestSimpleRect.java實例成員變量(實例變量):變量的值依賴于某個具體實例實例成員方法(實例方法):只能被具體的實例所調用,并能使用具體實例的數據域調用對象(當前對象):調用實例方法的對象實例成員:實例變量和實例方法346.2.1類的定義6.2.2對象創建6.2.3對象訪問356-4對象成員訪問操作符是

[填空1]

作答填空題1分內容366.1面向對象概述6.2類與對象6.3靜態成員6.4可見性修飾符6.5數據域封裝6.6變量作用域6.7對象與方法6.8對象數組6.9ArrayList6.10this引用6.11Java常用類6.3靜態成員classclassName{

成員;

構造方法;}37成員實例成員實例變量實例常量實例方法靜態成員靜態變量靜態常量靜態方法在有些場景中,有些信息需要被一個類的所有實例共享,或者在調用成員方法時,直接使用類名調用。在這些場景中,類的靜態成員需要被使用。6.3靜態成員classclassName{

成員;

構造方法;}38成員實例成員實例變量實例常量實例方法靜態成員靜態變量靜態常量靜態方法屬于某個具體實例6.3靜態成員classclassName{

成員;

構造方法;}39成員實例成員實例變量實例常量實例方法靜態成員靜態變量靜態常量靜態方法通過類的一個實例調用6.3靜態成員classclassName{

成員;

構造方法;}40成員實例成員實例變量實例常量實例方法靜態成員靜態變量靜態常量靜態方法被該類的所有實例共享6.3靜態成員classclassName{

成員;

構造方法;}41成員實例成員實例變量實例常量實例方法靜態成員靜態變量靜態常量靜態方法通過類名即可調用,無須與類的某個實例綁定。6.3靜態成員classclassName{

成員;

構造方法;}42成員實例成員實例變量實例常量實例方法靜態成員靜態變量靜態常量靜態方法靜態成員,也稱為類成員。要將成員聲明為靜態的,使用關鍵字static6.3靜態成員程序演示:程序清單6-6TestRectStaticDemo.java43建議:靜態成員最好用類名來訪問,即使用“類名.靜態變量”的方式訪問靜態變量,使用“類名.靜態方法(實際參數列表)”的方式訪問靜態方法。這不僅可以避免編譯警告錯誤,而且可以很容易地識別出類中的靜態成員。6.3靜態成員44調用實例方法訪問實例數據域調用靜態方法訪問靜態數據域實例方法靜態方法實例方法VS靜態方法6.3靜態成員45publicclassTestStatic{inti=1;staticintj=2;publicstaticvoidmain(String[]args){intk1=i;//錯誤,靜態方法不能訪問實例變量imethod1();//錯誤,靜態方法不能調用實例方法method1

intk2=method2(2);//正確,靜態方法可以調用另一個靜態方法

}//實例方法可以訪問靜態變量和靜態方法publicvoidmethod1(){i=i+j+method2(i);

}//靜態方法可以訪問靜態變量publicstaticintmethod2(intk){returnk*j;

}}6.3靜態成員46publicclassTestStatic{inti=1;staticintj=2;publicstaticvoidmain(String[]args){

intk1=i;//錯誤,靜態方法不能訪問實例變量imethod1();//錯誤,靜態方法不能調用實例方法method1

intk2=method2(2);//正確,靜態方法可以調用另一個靜態方法

}//實例方法可以訪問靜態變量和靜態方法publicvoidmethod1(){i=i+j+method2(i);

}//靜態方法可以訪問靜態變量publicstaticintmethod2(intk){returnk*j;

}}6.3靜態成員47publicclassTestStatic{ inti=1; staticintj=2; publicstaticvoidmain(String[]args){ TestStaticobj=newTestStatic(); intk1=obj.i;//正確,靜態方法訪問的是對象obj的實例變量i obj.method1();//正確,靜態方法調用的是對象obj的實例方法method1 intk2=method2(2);//正確,靜態方法可以調用另一個靜態方法 } //實例方法可以訪問靜態變量和靜態方法 publicvoidmethod1(){ i=i+j+method2(i); } //靜態方法可以訪問靜態變量 publicstaticintmethod2(intk){ returnk*j; }}正確訪問形式486-5能被一個類的所有實例共享的變量稱為()公有變量私有變量實例變量類變量ABCD提交單選題1分496-6請勾選可以添加static的位置:()publicclassTest{intcount;public[A]voidmain(String[]args){…}public[B]intgetCount(){returncount;}public[C]intfactorial(intn){intresult=1;…;returnresult;}}staticstaticstaticABC提交多選題2分內容506.1面向對象概述6.2類與對象6.3靜態成員6.4可見性修飾符6.5數據域封裝6.6變量作用域6.7對象與方法6.8對象數組6.9ArrayList6.10this引用6.11Java常用類6.4可見性修飾符516.4.1包6.4.2模塊module6.4.3public、private、包私有訪問權限6.4.1包包(package)可以將一組相關的類或接口組織在一起每個包具有一個獨一無二的包名,形成自己的命名空間,有助于防止命名沖突。具體來講,在兩個不同包中出現類名相同的類,是不會產生沖突的。包聲明語句要求是程序的第一條非注釋和非空白行的語句,而且必須是某源文件的第一條語句,使用關鍵字package,其語法形式:packagepackageName;packageName(包名)既可以是由一個合法標識符確定的名稱,也可以是由多個合法標識符用“.”(點號)連接而成的一個名稱。如果一個類在定義時,沒有聲明包,那么表示該類被放在默認包中。一個包的成員包括類、接口、子包。其中,一個包的類和接口在該包的編譯單元中,而一個包的子包擁有自己的編譯單元和子包。需要注意的是,包與子包是兩個獨立的編譯單元。在導入語句中,導入一個包,并不表示導入了其子包。52importjavafx.scene.*;可以導入javafx.scene包中類和接口,但是不能導入javafx.scene的子包javafx.scene.layout中的類和接口,因此,不能代替如下導入語句:importjavafx.scene.layout.*;6.4.1包一個包中不能包含兩個具有相同名字的成員。即,一個包內的類名、接口名、子包名不能重復出現。例1:包java.awt有一個子包image,因此它不能包含一個以image命名的類或接口。例2:一個命名為chapter6的包,擁有一個接口Print,那么就不能定義一個包名為chapter6.Print或chapter6.Print.doc的包。Eclipse環境創建演示536.4可見性修飾符546.4.1包6.4.2模塊module6.4.3public、private、包私有訪問權限6.4.2模塊module模塊(module)用于組織一組相關包。如果一些包具有較強的相關性,那么可以將這些包分組為一個模塊。項目、模塊、包之間的關系如下圖所示。556.4.2模塊module一個模塊能夠通過兩個關鍵字requires和exports,對自身所依賴(requires)的模塊和自身導出(exports)的包(package)進行聲明。一個模塊只能使用其他模塊導出(exports)的包(package),其他模塊也只能使用該模塊導出(exports)的包(package)。一個模塊能將它的部分包或全部包分類為exported(導出的),這意味著這些被導出包的類和接口可以通過模塊外部的代碼訪問。如果一個模塊的某個包沒有被該模塊導出,那么只有模塊內部的代碼可以訪問該包的類和接口。如果一個模塊中的代碼想要訪問另一個模塊導出的包,那么第一個模塊必須顯式依賴于第二個模塊。通常,新版本的集成開發環境(如Eclipse、IntellijIDEA等)在創建一個Java項目時,均可選擇創建一個模塊及其模塊描述文件module-info.java。為了不引入復雜性,本書后續的內容和示例不討論模塊的使用以及模塊對訪問特性的影響566.4可見性修飾符576.4.1包6.4.2模塊module6.4.3public、private、包私有訪問權限6.4.3public、private、包私有訪問權限可見性修飾符:用于確定一個類以及它的成員的可見性。放置在類、方法和數據域前:public,private,protectedpublic:類、方法和數據域可被任何包中的任何類訪問。可以修飾類與類的成員。private:數據域或方法只能被聲明的類訪問。只能修飾類的成員。包內訪問或包私有:如果未使用可見性修飾符,則默認類、方法和數據域可被同一包中的任何類訪問。58在局部變量上使用public可以嗎?在局部變量上使用private可以嗎?6.4.3public、private、包私有訪問權限private訪問特性示例59606-7如果一個類的成員變量只能在所在類中使用,則該成員變量必須使用的修飾符是()publicprotectedprivatestaticABCD提交單選題1分6.4.3public、private、包私有訪問權限如果沒有使用可見性修飾符放置在類、方法和數據域前,那么這些類、方法、數據域默認具有包私有訪問權限,可以被同一個包中的成員訪問,但是不能被其他包中的成員訪問。一個類的方法和數據域無論使用哪個可見性修飾符,該類總是可以訪問自身所有的數據域和方法。因此,可見性修飾符用于指明一個類的數據域和方法是否能在該類之外被訪問。616.4.3public、private、包私有訪問權限可見性修飾符修飾數據域和方法的示例626.4.3public、private、包私有訪問權限可見性修飾符修飾類的示例63內容646.1面向對象概述6.2類與對象6.3靜態成員6.4可見性修飾符6.5數據域封裝6.6變量作用域6.7對象與方法6.8對象數組6.9ArrayList6.10this引用6.11Java常用類6.5數據域封裝如果數據域是公有訪問權限,這些數據域被修改的可能性會擴展到其他任何類。這有可能導致如下兩個問題:非私有的數據域可以被其他類篡改程序的可維護性變差數據域封裝:為了避免外部其他類對一個類的數據域直接進行修改,可以使用private修飾符將數據域聲明為私有的私有數據域在類的外部不能直接被訪問,為了訪問私有數據域的值,可以提供公有的訪問方法供外部其他類調用。為了獲取私有數據域的值,提供一個獲取方法(getter)返回數據域的值為了修改私有數據域的值,提供一個設置方法(setter)為數據域設置新值656.5數據域封裝獲取方法的簽名一般形式如下:public返回值類型getPropertyName()如果返回值類型是boolean類型,一般如下定義獲取方法:pulibcbooleanisPropertyName()設置方法的簽名如下:publicvoidsetPropertyName(數據類型propertyValue)示例:程序清單6-7Rect_v1.java注意:除非有特殊要求,在設計一個類時,應該將其所有的數據域設置為私有的,其所有的構造方法和方法應該被聲明為公有的。66676-8下面哪個說法不正確()可使用private修飾符封裝數據域封裝數據域使得程序易于維護封裝數據域使得程序變短封裝數據域幫助防止程序錯誤ABCD提交單選題1分內容686.1面向對象概述6.2類與對象6.3靜態成員6.4可見性修飾符6.5數據域封裝6.6變量作用域6.7對象與方法6.8對象數組6.9ArrayList6.10this引用6.11Java常用類6.6變量作用域無論類的成員變量在類的何處聲明,其作用域是整個類。類的成員變量和成員方法可以在類中以任意順序出現。69當類的一個成員變量基于類的另一個成員變量來進行初始化時,則另一個成員變量必須先聲明706-9“一個類的成員變量的定義順序是任意的。”

這句話是否正確()正確錯誤AB提交單選題1分6.6變量作用域變量隱藏:如果一個局部變量和類的成員變量同名,那么局部變量優先,而同名的類的成員變量將被隱藏(hidden)71課堂思考:下面程序的輸出是什么?72{內容736.1面向對象概述6.2類與對象6.3靜態成員6.4可見性修飾符6.5數據域封裝6.6變量作用域6.7對象與方法6.8對象數組6.9ArrayList6.10this引用6.11Java常用類6.7對象與方法746.7.1對象作為方法的形參6.7.2對象作為方法的返回值6.7.3var聲明對象作為方法的局部變量6.7.1對象作為方法的形參當對象作為方法的形參時,實參將自己的引用值傳遞給形參,形參和實參會引用同一片內存區域,因此形參對內存區域的改變也會影響到實參。在Java語言中,參數傳遞本質上僅有一種方式,即值傳遞。無論一個方法的形參是基本數據類型或是引用數據類型,實參傳遞給形參的都是實參的值。示例:程序清單6-8TestPassValue.java756.7.1對象作為方法的形參76776-10當向一個方法傳遞對象參數時,()被傳遞給方法。對象的內容對象的一個copy對象的引用值對象的一個copy,這個copy對象的引用值ABCD提交單選題1分6.7對象與方法786.7.1對象作為方法的形參6.7.2對象作為方法的返回值6.7.3var聲明對象作為方法的局部變量6.7.2對象作為方法的返回值當一個對象類型作為方法返回值,需要使用類名作為方法的返回值類型。示例:程序清單6-9TestCreateRect.java796.7對象與方法806.7.1對象作為方法的形參6.7.2對象作為方法的返回值6.7.3var聲明對象作為方法的局部變量6.7.3var聲明對象作為方法的局部變量在方法中聲明一個對象作為局部變量,有兩種方式,例如:Rect_v1rect1=newRect_v1(3.0,5.0);//方式1:常規方式varrect2=newRect_v1(3.0,5.0);//方式2:var聲明方式var聲明方式可以使用關鍵字var替代類名,使得代碼更簡潔。局部變量的類型通過賦值語句右邊的表達式進行推斷。該聲明方式從Java10開始出現,如果可以從變量的初始值推導出它們的類型,那么可以用var關鍵字聲明局部變量,而無需指定其類型。使用關鍵字var還需注意:關鍵字var只能用于方法中的局部變量定義,不能用于形式參數聲明。816.7.3var聲明對象作為方法的局部變量在如下情況使用關鍵字var會發生編譯錯誤:(1)多個變量聲明在一起。(2)變量聲明時沒有進行初始化。(3)變量聲明時,賦值操作符左邊存在一個或多個方括號對。(4)變量初始化是一個數組初始化列表。(5)變量聲明在初始化時包含一個對自身的引用。Jshell驗證:826.7.3var聲明對象作為方法的局部變量836.7.3var聲明對象作為方法的局部變量846.7.3var聲明對象作為方法的局部變量85866-11下面對var關鍵字使用正確的是()

varobj=null;varf={3,4}varlist=newdouble[5];vari=1,j=2;ABCD提交單選題1分內容876.1面向對象概述6.2類與對象6.3靜態成員6.4可見性修飾符6.5數據域封裝6.6變量作用域6.7對象與方法6.8對象數組6.9ArrayList6.10this引用6.11Java常用類6.8對象數組當數組元素是某種類型的對象時,這樣的數組可被稱為對象數組。例如,下面的語句聲明并創建具有5個矩形對象的數組:Rect_v1[]rects=newRect_v1[5];初始化:示例:程序清單6-10CalMultiRectAreajava88for(inti=0;i<rects.length;i++)rects[i]=newRect_v1();內容896.1面向對象概述6.2類與對象6.3靜態成員6.4可見性修飾符6.5數據域封裝6.6變量作用域6.7對象與方法6.8對象數組6.9ArrayList6.10this引用6.11Java常用類6.9ArrayList對象數組是長度固定的,如果用于存儲個數不定的對象,就會出現問題:如果對象數組長度不夠,那么不能存儲所有對象如果對象數組長度太大,那么浪費存儲空間Java語言提供了一個數組列表類ArrayListArrayList(位于java.util包中),用來存儲不限定個數的某類對象。ArrayList是一種泛型類,具有一個泛型類型E。在創建一個ArrayList對象時,可以用一個具體的引用類型來替代E。例如:ArrayList<String>nameOfUniversities=newArrayList<String>();906.9ArrayList從JavaSE7開始,ArrayList構造方法中不再要求給出具體引用類型的名稱,具體地,語句如下:91ArrayList<具體引用類型>nameOfUniversities=newArrayList<具體引用類型>();ArrayList<具體引用類型>nameOfUniversities=newArrayList<>();簡化6.9ArrayList數組列表類ArrayList有三個構造方法:(1)無參構造方法:ArrayList(),創建一個初始容量為10的數組列表對象。(2)指定初始容量的構造方法:ArrayList(intinitialCapacity),創建一個指定初始容量的數組列表對象。(3)從其他集合對象創建的構造方法:ArrayList(Collection<?ExtendsE>c),創建一個數組列表對象容納指定集(Collection)對象c926.9ArrayList936.9ArrayList94示例:程序清單6-11ArrayListDemo1.java6.9ArrayList有時候需要從一個對象數組創建一個列表,或者相反。雖然可以通過循環實現,但是代碼不夠簡潔,可以使用Java語言提供的API更加容易地實現。使用方法Arrays.asList()可以實現從一個對象數組創建一個數組列表對象,例如:String[]nameArray={"法正","郭嘉","諸葛亮"};ArrayList<String>nameList=newArrayList<>(Arrays.asList(nameArray));使用ArrayList的實例方法toArray()可以實現從一個數組列表對象創建一個對象數組,例如:String[]nameArray1=newString[nameList.size()];nameList.toArray(nameArray1);95966-12假設一個數組列表對象包含{"red","red","green"},在執行下面代碼之后list的值是多少?(){"red","red","green"}{"red","green"}{"green"}{}ABCD提交Stringelement="red";for(inti=0;i<list.size();i++)if(list.get(i).equals(element))list.remove(element);單選題1分976-13假設一個數組列表對象包含{"red","red","green"},在執行下面代碼之后list的值是多少?{"red","red","green"}{"red","green"}{"green"}{}ABCD提交

Stringelement="red";for(inti=0;i<list.size();i++)if(list.get(i).equals(element))if(list.get(i).equals(element)){list.remove(element);i--;}單選題1分內容986.1面向對象概述6.2類與對象6.3靜態成員6.4可見性修飾符6.5數據域封裝6.6變量作用域6.7對象與方法6.8對象數組6.9ArrayList6.10this引用6.11Java常用類6.10this引用關鍵字this用于一個對象引用自身。通過關鍵字this,可以引用對象的實例成員。通常,關鍵字this是被隱式使用的。this隱式使用示例:下一頁this引用在兩種情況下是必須顯式使用的:需要引用被方法或構造方法的參數所隱藏的數據域時需要調用一個重載的構造方法時996.10this引用this引用隱式使用1006.10this引用1016.10.1this引用被隱藏數據域6.10.2this調用構造方法6.10.1this引用被隱藏數據域通常,使用數據域作為構造方法或設置方法的參數是一個好方法,這可以使得代碼易于閱讀,并且避免創建不必要的名字。然而,由于參數與數據域同名,在構造方法或設置方法中,需要顯式使用關鍵字this來引用被隱藏的數據域名稱。1026.10.1this引用被隱藏數據域被隱藏的實例變量,可以通過this引用來訪問。被隱藏的靜態變量,可以通過類名來訪問。其訪問形式為:類名.靜態變量。1036.10this引用1046.10.1this引用被隱藏數據域6.10.2this調用構造方法6.10.2this調用構造方法關鍵字this可以在一個類的構造方法中使用,用于調用該類的另一個構造方法。需要注意的是,在一個構造方法使用this調用其他構造方法時,this調用其他構造方法的語句應該是該構造方法的第一條語句。105示例:討論題下面代碼有無錯誤?如有,請指出哪一行有錯誤。106publicclassMain{privatedoubleintrst;publicvoidf1(){rst=12;}publicvoidf2(){Mrst

=

12.5;}}內容1076.1面向對象概述6.2類與對象6.3靜態成員6.4可見性修飾符6.5數據域封裝6.6變量作用域6.7對象與方法6.8對象數組6.9ArrayList6.10this引用6.11Java常用類6.11Java常用類1086.11.1基本數據類型的包裝類6.11.2BigInteger類和BigDecimal類6.11.3Random類6.11.4Date類6.11.1基本數據類型的包裝類Java語言的所有基本類型都有其對應包裝類。byte——Byte、short——Short、int——Integer、long——Long、float——Float、double——Double、char——Character、Boolean——Boolean)Java語言為什么既提供基本數據類型,又提供對應的包裝類呢?一方面,Java語言提供基本數據類型是為了性能,如果把基本數據類型作為對象使用的,那么處理對象時,Java語言是需要額外的系統開銷的。另一方面,Java語言提供的一些數據結構和方法需要將引用類型作為參數,于是,為了讓這些數據結構和方法能對基本數據類型的值進行處理,Java語言提供基本類型對應的包裝類。例如,ArrayList<E>是一個動態的對象數組,如果要讓該數據結構存儲整數,那么必須將整數轉化成對應的整數類類型。1096.11.1基本數據類型的包裝類數值包裝類(Byte、Short、Integer、Long、Float、Double)的使用非常相似,都具有方法:byteValue()、shortValue()、intValue()、longValue()、floatValue()、doubleValue()。這些方法可將對象轉化為基本數據類型值。基本數據類型包裝類都是最終類(7.4節介紹),意味著所有包裝類的實例一旦創建,就都是不可變的,即包裝類實例包含的值就不能再改變了。所有基本數據類型包裝類的構造方法從Java9開始成為過時方法,在未來的版本中會被移除。為了提升性能,構建基本數據類型包裝類對象,建議采用靜態的工廠方法valueOf(工廠模式是一種設計模式,這里不展開介紹)進行創建1106.11.1基本數據類型的包裝類Integer、Double創建對象示例:通過數值創建Integer、Double對象示例1116.11.1基本數據類型的包裝類通過字符串創建Integer、Double對象示例1121136-14下面語句是否正確,“Integer對象最好通過構造方法創建”()正確錯誤AB提交單選題1分6.11.1基本數據類型的包裝類基本數據類型最大值、最小值示例1146.11.1基本數據類型的包裝類每個數值包裝類包含一些共有方法:doubleValue()、floatValue()、longValue()、intValue()、shortValue()、byteValue()1156.11.1基本數據類型的包裝類數值包裝類都有一個compareTo方法,用于比較兩個數值:1166.11.1基本數據類型的包裝類每個數值包裝類都提供了相應的靜態解析方法parseXXX(Strings)(XXX代表Byte、Short、Int、Long、Float、Double中的任意一個),將字符串轉換成相應的基本數據類型。1176.11.1基本數據類型的包裝類對于整數包裝類,Java還提供了一個重載的解析方法parseXXX(Strings,intradix),提供第2個參數(radix)指定基數為2、8、16,可將數值字符串解析為以指定值為基數的數值。1186.11.1基本數據類型的包裝類數值包裝類還有靜態方法toString和實例方法toString,用于將相應的數據類型值轉換成字符串表示。1196.11.1基本數據類型的包裝類基本數據類型和其包裝類類型之間可以自動轉換。基本數據類型值被轉換為包裝類對象的過程被稱為裝箱(boxing),與之相反的過程被稱為拆箱(unboxing)。如果一個基本數據類型值出現在需要使用對象的上下文環境中,Java編譯器會對基本數據類型值進行自動裝箱。如果一個包裝類對象出現在需要使用基本數據類型值的上下文環境中,Java編譯器會對包裝類對象進行自動拆箱。示例:1206.11.1基本數據類型的包裝類由于基本數據類型和其包裝類類型之間可以自動進行轉換,所以使用ArrayList類可以創建存儲不定個數的數值(整數或浮點數等)的列表。例如,下面創建一個存儲整數的列表,并對列表進行操作,代碼如下:ArrayList<Integer>intList=newArrayList<>();intList.add(4); //整數4自動轉換為Integer對象intList.add(5); //整數5自動轉換為Integer對象inti1=intList.get(0);//索引為0的Integer對象自動轉換為整數4inti2=intList.get(1);//索引為1的Integer對象自動轉換為整數5雖然基本數據類型和其包裝類類型之間可以自動轉換,但是這并不表示在創建ArrayList對象時能用基本類型代替包裝類。例如,下面語句是錯誤的:ArrayList<int>intList=newArrayList<>();這是因為泛型類型E必須是引用類型,int是基本數據類型。1211226-15下列哪些語句將一個字符串s轉換為一個double值d?()d=Double.parseDouble(s);d=(newDouble(s)).doubleValue();d=Double.valueOf(s).doubleValue();以上都對ABCD提交單選題1分6.11.1基本數據類型的包裝類程序清單6-12的實例展示了ArrayList存儲不定個數浮點數的情況,模擬了一個購物結算場景。程序演示:程序清單6-12ArrayListDemo2.java123這時Java編譯器會報錯。其原因在于100是int型值不能自動裝箱為Double對象第9行的代碼會把int型值自動轉換double型值,然后double型值會自動裝箱成Double對象。假如在程序清單6-12第13行空行加一條語句是否正確,語句如下:prices.add(100);程序清單6-12所示程序在執行時,用戶輸入數據也輸入了整數3、4,為什么程序沒有報錯呢?6.11.1基本數據類型的包裝類Integer類124數據域說明privateintvalue當前Integer對象對應的int值publicstaticfinaldoubleMAX_VALUE正的最大double值,(2-2-52)·21023publicstaticfinaldoubleMIN_VALUE正的最小double值,2-1074構造方法說明public

Integer(int

value)以指定值value構建一個Integer對象。從Java9開始,這個構造方法將成為過時的方法。靜態方法valueOf(int)是一個更好的選擇,具有更好地空間和時間性能。public

Integer(String

s)以字符串表示的浮點值構建一個Integer對象。從Java9開始,這個構造方法將成為過時的方法。使用靜態方法parseInteger(String)將String轉換為int值,或使用靜態方法valueOf(String)將一個String對象轉換成一個Integer對象6.11.1基本數據類型的包裝類Integer類125常用方法說明public

byte

byteValue()返回當前Integer對象的byte值public

short

shortValue()返回當前Integer對象的short值public

int

intValue()返回當前Integer對象的int值public

long

longValue()返回當前Integer對象的long值public

float

floatValue()返回當前Integer對象的float值public

double

doubleValue()返回當前Integer對象的double值publicstatic

Integer

valueOf(inti)基于給定的int值返回一個Integer對象publicstatic

Integer

valueOf(String

s)返回一個Integer對象,參數s是該對象擁有的int值的字符串表示publicstatic

Integer

valueOf(String

s,intradix)返回一個Integer對象,該對象保存從指定字符串中提取的值,解析指定字符串s時,使用第二個參數給定的基數。publicstatic

int

parseInt(String

s)返回一個新的有符號十進制int值,該值通過解析指定字符串s獲得publicstatic

int

parseInt(String

s,intradix)返回一個新的有符號int值,該值通過解析指定字符串s獲得,解析字符串s時,使用第二個參數給定的基數6.11.1基本數據類型的包裝類Integer類126常用方法說明publicstatic

int

parseUnsignedInt(String

s)自Java8開始提供該方法,把字符串s解析為無符號十進制整數,并返回該整數值publicstatic

int

parseUnsignedInt(String

s,int

radix)自Java8開始提供該方法,把字符串s解析為以第二個參數為基數的無符號整數,并返回該整數值publicstatic

Integer

valueOf(String

s,int

radix)基于第二個參數給定的基數,把字符串s解析為無符號整數,并返回該整數值publicstatic

String

toString(inti)基于十進制,返回一個int值i的字符串表示publicstatic

String

toBinaryString(int

i)返回整數參數i的字符串表示,這個字符串表示是參數i對應的以2為基數的無符號整數publicstatic

String

toOctalString(int

i)返回整數參數i的字符串表示,這個字符串表示是參數i對應的以8為基數的無符號整數publicstatic

String

toHexString(inti)返回整數參數i的字符串表示,這個字符串表示是參數i對應的以16為基數的無符號整數publicstatic

String

toUnsignedString(int

i)自Java8開始提供該方法,返回參數i的字符串表示,這個字符串表示是參數i對應的十進制無符號數。6.11.1基本數據類型的包裝類Integer類127常用方法說明publicstatic

long

toUnsignedLong(int

x)將參數x轉換為無符號的long類型值public

String

toString()返回當前Integer對象的字符串表示public

int

compareTo(Integer

anotherInteger)當前Integer對象與給定的Integer對象anotherInteger進行比較,比較兩個對象包含的數值,當前者大于、等于、小于后者時,分別返回1、0、-16.11.1基本數據類型的包裝類Double類128數據域說明privatedoublevalueDouble對象對應的double值publicstaticfinaldoubleMAX_VALUE正的最大double值,(2-2-52)·21023publicstaticfinaldoubleMIN_VALUE正的最小double值,2-1074構造方法說明public

Double(double

value)以指定值value構建一個Double對象。從Java9開始,這個構造方法將成為過時的方法。靜態方法valueOf(double)是一個更好的選擇,具有更好地空間和時間性能。public

Double(String

s)以字符串表示的浮點值構建一個Double對象。從Java9開始,這個構造方法將成為過時的方法。使用靜態方法parseDouble(String)將一個String轉化為一個double值,或使用靜態方法valueOf(String)將一個String對象轉換成一個Double對象6.11.1基本數據類型的包裝類Double類129常用方法說明public

byte

byteValue()返回當前Double對象的byte值public

short

shortValue()返回當前Double對象的short值public

int

intValue()返回當前Double對象的int值public

long

longValue()返回當前Double對象的long值public

float

floatValue()返回當前Double對象的float值public

double

doubleValue()返回當前Double對象的double值publicstatic

Double

valueOf(double

d)基于給定的double值返回一個Double對象publicstatic

Double

valueOf(String

s)返回一個Double對象,參數s是該對象擁有的double值的字符串表示publicstatic

double

parseDouble(String

s)返回一個新的double值,該值由指定字符串s表示publicstatic

String

toString(double

d)返回一個double值d的字符串表示publicstatic

String

toHexString(double

d)返回一個double值d的十六進制字符串表示public

String

toString()返回當前Double對象字符串表示public

int

compareTo(Double

anotherDouble)當前Double對象與給定的Double對象anotherDouble進行比較,比較兩個對象包含的數值,當前者大于、等于、小于后者時,分別返回1、0、-16.11Java常用類1306.11.1基本數據類型的包裝類6.11.2BigInteger類和BigDecimal類6.11.3Random類6.11.4Date類6.11.2BigInteger類和BigDecimal類java.math包中提供了BigInteger類和BigDecimal類。它們都是最終類,可以分別用于表示任意大小和精度的整數和十進制數,支持非常大的數的計算或者高精度浮點值的計算。BigInteger類的publicstaticfinalBigInteger數據域131數據域說明ZEROBigInteger常量0ONEBigInteger常量1TWOBigInteger常量2TENBigInteger常量106.11.2BigInteger類和BigDecimal類BigInteger類的部分構造方法與常用方法132方法頭說明public

BigInteger(String

val)將一個BigInteger的十進制字符串表示翻譯成一個BigInteger對象public

BigInteger(String

val,int

radix)將一個BigInteger、以指定基數radix的字符串表示翻譯成一個BigInteger對象public

BigInteger

add(BigInteger

val)返回當前對象與給定對象val的和public

BigInteger

subtract(BigInteger

val)返回當前對象減去給定對象val的差public

BigInteger

multiply(BigInteger

val)返回當前對象與給定對象val的乘積public

BigInteger

divide(BigInteger

val)返回當前對象除以給定對象val的商public

BigInteger

remainder(BigInteger

val)返回當前對象除以給定對象val的余數public

BigInteger

pow(int

exponent)返回當前對象的exponent次冪public

BigInteger

sqrt()返回當前對象的平方根public

BigInteger

gcd(BigInteger

val)返回當前對象與給定對象val的最大公約數public

BigInteger

abs()返回一個BigInteger對象,其值是當前BigInteger對象的絕對值public

BigInteger

negate()返回一個BigInteger對象,其值是對當前BigInteger對象取反(-this)1336-16表示任意大小和精度的十進制數類是

[填空1]

作答填空題1分6.11.2BigInteger類和BigDecimal類BigInteger類使用示例1346.11.2BigInteger類和BigDecimal類BigDecimal類的publicstaticfinalBigInteger數據域135數據域說明ZEROBigDecimal常量0,scale為0ONEBigDecimal常量1,scale為0TENBigDecimal常量10,scale為06.11.2BigInteger類和BigDecimal類BigDecimal類的部分構造方法和常用方法136方法頭說明public

BigDecimal(String

val)將一個BigDecimal的字符串表示翻譯成一個BigDecimal對象public

BigDecimal(BigIntegerval)將一個BigInteger翻譯成一個BigDecimal對象,其scale為0。public

BigDecimal(double

val)將雙精度值val轉換為一個BigDecimal對象,該對象是雙精度二進制浮點值的精確十進制表示。public

BigDecimal(long

val)將一個long類型值val翻譯成一個BigDecimal對象,其scale為0。public

BigDecimal(int

val)將一個int類型值val翻譯成一個BigDecimal對象,其scale為0。public

BigDecimal

add(BigDecimal

val)返回當前對象與給定對象val的和public

BigDecimal

subtract(BigDecimalval)返回當前對象減去給定對象val的差public

BigDecimal

multiply(BigDecimal

val)返回當前對象與給定對象val的乘積public

BigDecimal

divide(BigDecimal

val)返回當前對象除以給定對象val的商public

BigDecimal

remainder(BigDecimal

val)返回當前對象除以給定對象val的余數public

BigDecimal

pow(int

n)返回當前對象的n次冪public

BigDecimal

sqrt()返回當前對象的平方根public

BigDecimal

abs()返回一個BigDecimal對象,

溫馨提示

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

評論

0/150

提交評論