Java語言程序設(shè)計(jì) 課件 第4章 類、對(duì)象和方法_第1頁
Java語言程序設(shè)計(jì) 課件 第4章 類、對(duì)象和方法_第2頁
Java語言程序設(shè)計(jì) 課件 第4章 類、對(duì)象和方法_第3頁
Java語言程序設(shè)計(jì) 課件 第4章 類、對(duì)象和方法_第4頁
Java語言程序設(shè)計(jì) 課件 第4章 類、對(duì)象和方法_第5頁
已閱讀5頁,還剩125頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

Java語言程序設(shè)計(jì)第4章類、對(duì)象和方法

1面向?qū)ο蟾攀?3主要內(nèi)容Java語言程序設(shè)計(jì)(第4版)清華大學(xué)出版社2022定義類與創(chuàng)建對(duì)象構(gòu)造方法45案例:使用自定義日期類方法設(shè)計(jì)7靜態(tài)變量和靜態(tài)方法89案例:打印斐波那契數(shù)列對(duì)象個(gè)初始化10變量的作用域6案例:分?jǐn)?shù)類Fraction的設(shè)計(jì)11局部變量類型推斷12垃圾回收J(rèn)ava語言程序設(shè)計(jì)面向?qū)ο蟾攀鯰IOBE編程語言2022年9月排行榜Python排名第一,Python再次刷新了自己的占比,以4.07%的增長率占據(jù)15.74%的市場份額。相較之下,C、Java、C++和C#的占比都有所下降。Python用于大數(shù)據(jù)、人工智能、數(shù)據(jù)分析。C用于嵌入式、底層開發(fā)、系統(tǒng)開發(fā)。Java用于網(wǎng)絡(luò)開發(fā)、企業(yè)開發(fā)等。TOP10編程語言排名走勢Java語言程序設(shè)計(jì)(第4版)清華大學(xué)出版社計(jì)算機(jī)語言范式Java語言程序設(shè)計(jì)(第4版)清華大學(xué)出版社計(jì)算機(jī)編程語言范式面向過程面向?qū)ο蠛瘮?shù)式邏輯式FORTRANCOBOLBASICAdaPascalCSmalltalkC++VisualBasicC#JavaPythonLISPSchemeProlog計(jì)算機(jī)語言可以根據(jù)其解決問題的方法進(jìn)行分類。范式是描述程序如何處理數(shù)據(jù)的模型或框架。對(duì)計(jì)算機(jī)語言有多種分類方法。根據(jù)范式可分為四種:面向過程的編程語言、面向?qū)ο蟮木幊陶Z言、函數(shù)式編程語言和邏輯式編程語言。面向?qū)ο缶幊痰漠a(chǎn)生Java語言程序設(shè)計(jì)(第4版)清華大學(xué)出版社吸收了結(jié)構(gòu)化程序設(shè)計(jì)思想精華,提出一些新的概念。以接近人類思維的方法描述軟件對(duì)象,降低了軟件開發(fā)難度,提高了開發(fā)速度。軟件具有可復(fù)用、易維護(hù)以及可擴(kuò)展性。OOP成為當(dāng)今最流行的軟件開發(fā)技術(shù)。面向?qū)ο缶幊痰漠a(chǎn)生Java語言程序設(shè)計(jì)(第4版)清華大學(xué)出版社現(xiàn)實(shí)世界OOP語言類,對(duì)象計(jì)算機(jī)世界抽象C語言等基本概念Java語言程序設(shè)計(jì)(第4版)清華大學(xué)出版社面向?qū)ο蟪绦蛟O(shè)計(jì)(object-orientedprogramming,OOP)對(duì)象(Object)現(xiàn)實(shí)世界中,一個(gè)人、一輛汽車、一臺(tái)電視機(jī)、一所學(xué)校,一次會(huì)議、一場足球比賽、一個(gè)賬戶等

。對(duì)象的兩方面的特征:狀態(tài):描述對(duì)象的靜態(tài)特征。行為:描述對(duì)象的動(dòng)態(tài)特征?;靖拍頙ava語言程序設(shè)計(jì)(第4版)清華大學(xué)出版社一輛汽車:狀態(tài)描述:生產(chǎn)廠家、顏色、出廠年份、價(jià)格等。行為描述:啟動(dòng)、加速、轉(zhuǎn)彎和停止等

。對(duì)象的定義:是其自身所具有的狀態(tài)特征及可以對(duì)這些狀態(tài)施加的操作結(jié)合在一起所構(gòu)成的實(shí)體?;靖拍頙ava語言程序設(shè)計(jì)(第4版)清華大學(xué)出版社一名員工:狀態(tài)描述:姓名、年齡、工資。行為描述:說話、工作、計(jì)算工資等

?;靖拍頙ava語言程序設(shè)計(jì)(第4版)清華大學(xué)出版社一個(gè)對(duì)象可以非常簡單,也可以非常復(fù)雜。復(fù)雜的對(duì)象往往是由若干個(gè)簡單對(duì)象組合而成的。例如,一輛汽車就是由發(fā)動(dòng)機(jī)、輪胎、車身等許多其他對(duì)象組成?;靖拍頙ava語言程序設(shè)計(jì)(第4版)清華大學(xué)出版社類(class)最重要的概念。如人類、魚類、交通工具類等。類定義:具有相似特征和行為的對(duì)象的描述。人類具有的區(qū)別于其他動(dòng)物的特征有直立行走、使用工具、使用語言交流、能工作等。所有的事物都可以歸到某類中。例如,汽車屬于交通工具類,手機(jī)屬于通信工具類。

基本概念Java語言程序設(shè)計(jì)(第4版)清華大學(xué)出版社實(shí)例(instance)或?qū)ο竽硞€(gè)類的一個(gè)具體的對(duì)象稱為該類的一個(gè)實(shí)例。例如,我的汽車是汽車類的實(shí)例,張三是學(xué)生類的實(shí)例。類3個(gè)實(shí)例基本概念Java語言程序設(shè)計(jì)(第4版)清華大學(xué)出版社消息對(duì)象與對(duì)象之間不是孤立的,它們之間存在著某種聯(lián)系,這種聯(lián)系是通過消息傳遞的。例如,開汽車就是人向汽車傳遞消息。向?qū)ο蟀l(fā)送的消息包含三方面的內(nèi)容接收消息的對(duì)象接收對(duì)象采用的方法(操作)方法所需要的參數(shù)myCar.speedUp(100);OOP的優(yōu)勢Java語言程序設(shè)計(jì)(第4版)清華大學(xué)出版社可復(fù)用代碼可被代碼的創(chuàng)建者或其他人復(fù)用。語言本身提供類庫或API(應(yīng)用編程接口)。問題的解決方案也可復(fù)用,這些方案稱為設(shè)計(jì)模式。易維護(hù)很容易實(shí)現(xiàn)程序模塊化,減少了維護(hù)的開銷。類就是一個(gè)模塊,并且可以繼承。可以實(shí)現(xiàn)“高內(nèi)聚,低耦合”??蓴U(kuò)展功能可以被擴(kuò)展或增強(qiáng)。通過繼承來實(shí)現(xiàn)。Java語言程序設(shè)計(jì)定義類與創(chuàng)建對(duì)象面向?qū)ο缶幊叹褪鞘褂脤?duì)象進(jìn)行程序設(shè)計(jì)。對(duì)象代表現(xiàn)實(shí)世界中可以明確標(biāo)識(shí)的一個(gè)實(shí)體。每個(gè)對(duì)象都有自己獨(dú)特的標(biāo)識(shí)、狀態(tài)和行為。概述類是組成Java程序的基本要素,它封裝了一類對(duì)象的狀態(tài)和行為,是這一類對(duì)象的原形。定義一個(gè)新的類,就創(chuàng)建了一種新的數(shù)據(jù)類型,實(shí)例化一個(gè)類,就得到一個(gè)對(duì)象。類是一個(gè)模板或藍(lán)圖,它用來定義對(duì)象的數(shù)據(jù)域是什么以及方法是做什么的。一個(gè)對(duì)象是類的一個(gè)實(shí)例(instance)??梢杂靡粋€(gè)類創(chuàng)建多個(gè)實(shí)例。創(chuàng)建實(shí)例的過程稱為實(shí)例化(instantiation)。6.1.1類的定義Java語言程序設(shè)計(jì)(第4版)清華大學(xué)出版社一個(gè)類的定義包括兩個(gè)部分類聲明類體的定義類聲明的一般格式為

[public]classClassName{//1.成員變量聲明:定義狀態(tài)//2.構(gòu)造方法的定義//3.成員方法的定義:定義行為}packagecom.boda.xy;publicclassEmployee{Stringname;intage;

doublesalary;publicEmployee(){}publicStringgetName(){returnname;}程序4.1Employee.javapublicvoidsetName(Stringname){=name;}publicintgetAge(){returnage;}publicvoidsetAge(intage){this.age=age;}publicdoublegetSalary(){returnsalary;}

publicvoidsetSalary(doublesalary){this.salary=salary;}publicvoidsayHello(){System.out.println("Mynameis"+name);}publicdoublecomputeSalary(inthours,doublerate){doubletotalSalary=salary+hours*rate;returntotalSalary;}}有了Employee類,就可以創(chuàng)建該類的實(shí)例,然后訪問它的成員和調(diào)用它的方法完成有關(guān)操作,如調(diào)用computeSalary()方法計(jì)算員工的工資等。下面程序使用Employee類創(chuàng)建一個(gè)對(duì)象并訪問它的變量和方法。創(chuàng)建和使用對(duì)象publicstaticvoidmain(String[]args){Employeeemployee;employee=newEmployee();="李明";employee.age=28;employee.salary=5000.00;System.out.println("姓名="

+);System.out.println("年齡="

+employee.age);System.out.println("工資="

+employee.salary);employee.sayHello();}程序4.2EmployeeDemo.java6.1.1創(chuàng)建和使用對(duì)象Java語言程序設(shè)計(jì)(第4版)清華大學(xué)出版社使用構(gòu)造方法創(chuàng)建對(duì)象Employeeemployee;employee=newEmployee();employee:Employeename:nullage:0salary:0.0="李明";employee.age=28;employee.salary=5000.00;:Employeename:李明age:28salary:5000.06.1.1創(chuàng)建和使用對(duì)象Java語言程序設(shè)計(jì)(第4版)清華大學(xué)出版社若要聲明多個(gè)同類型的對(duì)象名,可用逗號(hào)分開。

Employeeemp1,emp2;也可以將對(duì)象的聲明和創(chuàng)建對(duì)象使用一個(gè)語句完成。

Employeeemployee=newEmployee();若對(duì)象僅在創(chuàng)建處使用,也可以不聲明引用名,如下面語句直接創(chuàng)建一個(gè)Employee對(duì)象,然后調(diào)用其sayHello()方法。newEmployee().sayHello();6.1.1對(duì)象的引用賦值Java語言程序設(shè)計(jì)(第4版)清華大學(xué)出版社假設(shè)聲明2個(gè)員工對(duì)象Employeeemp1=newEmployee();=“李明";Employeeemp2=emp1;=“劉晨";System.out.println();emp1:Employeename:李明age:0salary:0.0emp2:Employeename:劉晨age:0salary:0.0UML(UnifiedModelingLanguage)稱為統(tǒng)一建模語言,它是一種面向?qū)ο蟮慕UZ言,它運(yùn)用統(tǒng)一的、標(biāo)準(zhǔn)化的標(biāo)記和定義實(shí)現(xiàn)對(duì)軟件系統(tǒng)進(jìn)行面向?qū)ο蟮拿枋龊徒?。用UML圖表示類在UML中可以用類圖描述一個(gè)類。圖4-4是Employee類的類圖,它用長方形表示,一般包含三個(gè)部分:上面是類名,中間是成員變量清單,下面是構(gòu)造方法和普通方法清單。有時(shí)為了簡化類的表示,可能省略后兩部分,只保留類名部分。在UML類圖中,可以包含有關(guān)成員訪問權(quán)限的信息。public成員的前面加一個(gè)“+”,private成員前加“-”,protected成員前加“#”,不加任何前綴的成員被看作具有默認(rèn)訪問級(jí)別。用UML圖表示類Employee類包含三個(gè)私有成員變量,兩個(gè)構(gòu)造方法和三個(gè)普通方法。在UML圖中,成員變量和類型之間用冒號(hào)分隔。方法的參數(shù)列表放在圓括號(hào)中,參數(shù)需指定名稱和類型,它的返回值類型寫在一個(gè)冒號(hào)后面。當(dāng)Java程序運(yùn)行時(shí),JVM首先需要將有關(guān)類的字節(jié)碼加載到內(nèi)存,對(duì)字節(jié)碼進(jìn)行校驗(yàn),然后需要給數(shù)據(jù)和代碼分配內(nèi)存空間。JVM將內(nèi)存大致分為3個(gè)部分:棧區(qū)、堆區(qū)、方法區(qū)。理解棧與堆棧區(qū):由編譯器自動(dòng)分配釋放,局部變量的值、方法的參數(shù)值等存儲(chǔ)在棧區(qū),方法執(zhí)行結(jié)束后,系統(tǒng)自動(dòng)釋放棧區(qū)內(nèi)存。堆區(qū):由程序員分配,存放new創(chuàng)建的對(duì)象和數(shù)組,JVM不定期檢查堆區(qū),如果對(duì)象沒有引用指向它,內(nèi)存將被回收。方法區(qū):存放類的元數(shù)據(jù)、靜態(tài)字段和方法字節(jié)碼。理解棧與堆下面通過一個(gè)簡單例子說明棧區(qū)、堆區(qū)和方法區(qū)內(nèi)存的分配情況。設(shè)有下面Person類和PersonDemo類的定義。publicclassPerson{intage=20;publicvoidshow(){System.out.println(age);}}PersonDemo類publicclassPersonDemo{publicvoidmain(String[]args){intnum=88;Personp=newPerson();p.show();}}當(dāng)main()方法執(zhí)行時(shí),JVM首先創(chuàng)建一個(gè)活動(dòng)記錄(activationrecord),它包括main()方法中聲明的局部變量num和p對(duì)象引用,它們存儲(chǔ)在棧中。用new創(chuàng)建對(duì)象時(shí),將在堆中分配內(nèi)存,棧中存放對(duì)象的首地址。理解棧與堆Java語言程序設(shè)計(jì)構(gòu)造方法每個(gè)類都有構(gòu)造方法(constructor),構(gòu)造方法用來創(chuàng)建類的對(duì)象或?qū)嵗?gòu)造方法也有名稱、參數(shù)和方法體。構(gòu)造方法與普通方法的區(qū)別是:(1)構(gòu)造方法的名稱必須與類名相同。(2)構(gòu)造方法不能有返回值,也不能返回void。(3)構(gòu)造方法必須在創(chuàng)建對(duì)象時(shí)用new運(yùn)算符調(diào)用。概述構(gòu)造方法定義的格式為:[public|protected|private]ClassName([paramlist]){//方法體}概述這里,public、protected和private為構(gòu)造方法的訪問修飾符,它用來決定哪些類可以使用該構(gòu)造方法創(chuàng)建對(duì)象。這些訪問修飾符與一般方法的訪問修飾符的含義相同。構(gòu)造方法名必須與類名相同,構(gòu)造方法可以帶有參數(shù)。如果在定義類是時(shí)沒有為類定義任何構(gòu)造方法,則編譯器自動(dòng)為類添加一個(gè)默認(rèn)構(gòu)造方法(defaultconstructor)。默認(rèn)構(gòu)造方法是無參數(shù)構(gòu)造方法(no-argsconstructor),方法體為空。假設(shè)沒有為Employee類定義構(gòu)造方法,編譯器提供的默認(rèn)構(gòu)造方法如下:無參數(shù)構(gòu)造方法publicEmployee(){}//默認(rèn)構(gòu)造方法用戶也可以為類定義無參數(shù)構(gòu)造方法,并在方法體中初始化對(duì)象。例如,在Employee類中,可以定義下面的無參數(shù)構(gòu)造方法:無參數(shù)構(gòu)造方法publicEmployee(){name="";age=0;salary=0.0;}使用無參數(shù)構(gòu)造方法創(chuàng)建對(duì)象,只需在類名后使用一對(duì)括號(hào)即可,如下所示:

Employeeemp=newEmployee();構(gòu)造方法主要作用是創(chuàng)建對(duì)象并初始化類的成員變量。對(duì)類的成員變量,若聲明時(shí)和在構(gòu)造方法都沒有初始化,新建對(duì)象的成員變量值都被賦予默認(rèn)值。對(duì)于不同類型的成員變量,其默認(rèn)值不同。整型數(shù)據(jù)的默認(rèn)值是0、浮點(diǎn)型數(shù)據(jù)默認(rèn)值是0.0、字符型數(shù)據(jù)默認(rèn)值是’\u0000’、布爾型數(shù)據(jù)默認(rèn)值是false。引用類型數(shù)據(jù)默認(rèn)值是null。構(gòu)造方法的主要作用如果希望在創(chuàng)建一個(gè)對(duì)象時(shí)就將其成員變量設(shè)置為某個(gè)值,而不是采用默認(rèn)值。這時(shí)可以定義帶參數(shù)構(gòu)造方法。例如,在創(chuàng)建一個(gè)Employee對(duì)象時(shí)就指定姓名、年齡和工資,則可以定義如下帶三個(gè)參數(shù)的構(gòu)造方法。帶參數(shù)構(gòu)造方法publicEmployee(Stringn,inta,doubles){name=n

;age=a;salary=s;}然后,在創(chuàng)建Employee對(duì)象時(shí)可以指定姓名、年齡和余額,如下代碼創(chuàng)建一個(gè)姓名為“李清泉”,年齡為28,工資為8000的員工對(duì)象。

Employeeemp=newEmployee("李清泉",28,8000.00);帶參數(shù)構(gòu)造方法注意,一旦為類定義了帶參數(shù)的構(gòu)造方法,編譯器就不再提供默認(rèn)構(gòu)造方法。再使用默認(rèn)構(gòu)造方法創(chuàng)建對(duì)象,編譯器將給出編譯錯(cuò)誤。如果還希望使用無參構(gòu)造方法創(chuàng)建對(duì)象,必須自己明確定義一個(gè)。構(gòu)造方法和普通方法都可以重載,所謂重載是在一個(gè)類中可以定義名稱相同、參數(shù)不同的方法。構(gòu)造方法重載程序4.3為Employee類定義了4個(gè)重載的構(gòu)造方法,其中包含一個(gè)無參數(shù)構(gòu)造方法和三個(gè)帶參數(shù)的構(gòu)造方法。程序4.3Employee.javapublicclassEmployee{Stringname;intage;doublesalary;publicEmployee(){="";this.age=0;this.salary=0.0;}publicEmployee(Stringname){=name;this.age=0;this.salary=0.00;}publicEmployee(Stringname,intage){=name;this.age=age;}publicEmployee(Stringname,intage,doublesalary){=name;this.age=age;this.salary=salary;}通過重載構(gòu)造方法,就可以有多種方式創(chuàng)建對(duì)象。由于有了這些重載的構(gòu)造方法,在創(chuàng)建Employee對(duì)象時(shí)就可以根據(jù)需要選擇不同的構(gòu)造方法。this表示對(duì)象本身,它自動(dòng)傳遞給實(shí)例方法和構(gòu)造方法。在一個(gè)方法的方法體或參數(shù)中,也可能聲明與成員變量同名的局部變量,此時(shí)的局部變量會(huì)隱藏成員變量。要使用成員變量就需要在前面加上this關(guān)鍵字this關(guān)鍵字publicEmployee(Stringname,intage,doublesalary){=name;this.age=age;this.salary=salary;}同樣在定義實(shí)例方法時(shí),方法參數(shù)名也可以與成員變量同名。這時(shí)在方法體中要引用成員變量也必須加上this。例如,在Employee類中可以像下面這樣定義修改姓名的方法:this關(guān)鍵字publicvoidsetName(Stringname){

=name;}這里,參數(shù)名與成員變量同名,因此,在方法體中通過使用成員變量name,而沒有帶this的變量name是方法的參數(shù)。this關(guān)鍵字的另一個(gè)用途是在一個(gè)構(gòu)造方法中調(diào)用該類的另一個(gè)構(gòu)造方法。例如,假設(shè)在Employee類定義了一個(gè)構(gòu)造方法Employee(Stringname,intage,doublesalary),現(xiàn)在又要定義一個(gè)無參數(shù)的構(gòu)造方法,這時(shí)可以在下面的構(gòu)造方法中調(diào)用該構(gòu)造方法this關(guān)鍵字publicEmployee(){this("張明月",28,5000);}【注意】

如果在構(gòu)造方法中調(diào)用另一個(gè)構(gòu)造方法,則this語句必須是第一條語句。綜上所述,this關(guān)鍵字主要使用在下面三種情況。this關(guān)鍵字解決局部變量與成員變量同名的問題。解決方法參數(shù)與成員變量同名的問題。用來調(diào)用該類的另一個(gè)構(gòu)造方法。Java語言規(guī)定,this只能用在實(shí)例方法和構(gòu)造方法中,不能用在static方法中。實(shí)際上,在對(duì)象調(diào)用一個(gè)非static方法時(shí),向方法傳遞了一個(gè)當(dāng)前對(duì)象的引用,在方法體中用this表示。Java語言程序設(shè)計(jì)使用自定義Date日期類在Java程序中經(jīng)常需要使用其他的類,包括核心類庫的類、用戶自定義的類和第三方類庫的類。這里定義了一個(gè)名為com.boda.utils.Date的日期類,并且將它打包到一個(gè)com.boda.jar文件中,現(xiàn)在看如何使用這個(gè)類。Date類的UML圖如圖4-6所示。問題描述com.boda.utils.Date類的UML圖針對(duì)上面給出的Date類,完成下面操作:(1)創(chuàng)建一個(gè)日期對(duì)象today表示今天的日期(用默認(rèn)構(gòu)造方法),調(diào)用today的toString()方法輸出今天的日期。

(2)創(chuàng)建一個(gè)日期對(duì)象birthday表示你的出生日期(用帶參數(shù)構(gòu)造方法)。

(3)輸出你的出生日期的年是否是閏年。(4)計(jì)算并輸出從你出生到今天一共過去多少天。要求importcom.boda.utils.Date;publicclassDateDemo{publicstaticvoidmain(String[]args){Datetoday=newDate();System.out.println(today.toString());Datebirthday=newDate(2002,10,26);System.out.println(birthday.getYear()+"年"+(birthday.isLeapYear()?"是閏年":"不是閏年"));System.out.println("你已出生"+birthday.between(today)+"天。");}}程序4.4DateDemo.javaJava語言程序設(shè)計(jì)方法設(shè)計(jì)6.1.1如何設(shè)計(jì)方法Java語言程序設(shè)計(jì)(第4版)

QQ群:288639486一個(gè)方法的定義包括兩個(gè)部分方法聲明方法體的定義方法聲明的一般格式為[public]returnTypemethodName([paramList]){//方法體}訪問修飾符返回值類型方法名參數(shù)列表方法的實(shí)現(xiàn)方法的簽名(方法名和參數(shù)組合)下面回顧一下4.2節(jié)Employee類中定義的computeSalary()方法,如圖4-8所示。如何設(shè)計(jì)方法6.1.1訪問方法和修改方法Java語言程序設(shè)計(jì)(第4版)

QQ群:288639486能夠返回成員變量值的方法稱為訪問方法(accessormethod)。能夠修改成員變量值的方法稱為修改方法(mutatormethod)。

訪問方法名一般為getXxx(),因此,也稱getter方法。如,

StringgetName()

修改方法名一般為setXxx(),因此,也稱setter方法。如,

voidsetName(Stringname)6.1.1方法的調(diào)用Java語言程序設(shè)計(jì)(第4版)

QQ群:288639486調(diào)用類的實(shí)例方法應(yīng)先創(chuàng)建一個(gè)對(duì)象,然后通過對(duì)象引用調(diào)用。調(diào)用類的靜態(tài)方法,通常使用類名調(diào)用。方法調(diào)用主要使用在三種場合:1)用對(duì)象引用調(diào)用類的實(shí)例方法。2)類中的方法調(diào)用本類中的其他方法。3)用類名直接調(diào)用static方法。方法重載Java語言程序設(shè)計(jì)(第4版)清華大學(xué)出版社Java允許在一個(gè)類中定義多個(gè)同名的方法,這稱為方法重載(overloading)。實(shí)現(xiàn)方法重載,要求同名的方法要么參數(shù)個(gè)數(shù)不同要么參數(shù)類型不同僅返回值不同不能區(qū)分重載的方法。publicvoiddisplay(inta){System.out.println("a="+a); }publicvoiddisplay(doubled){System.out.println("d="+d); } publicvoiddisplay(){System.out.println("無參數(shù)方法"); } publicvoiddisplay(inta,intb){System.out.println("a="+a+",b="+b); } 程序4.4OverloadDemo.java

publicstaticvoidmain(String[]args){OverloadDemoobj=newOverloadDemo();obj.display();obj.display(10);obj.display(50,60);obj.display(100.0);

}方法參數(shù)傳遞Java語言程序設(shè)計(jì)(第4版)清華大學(xué)出版社調(diào)用帶參數(shù)的方法,需要向它傳遞參數(shù)。定義方法指定的參數(shù)稱為形式參數(shù),調(diào)用方法指定的參數(shù)稱為實(shí)際參數(shù)。Java語言中,方法的參數(shù)是按值傳遞(passbyvalue)的,即在調(diào)用方法時(shí)將實(shí)際參數(shù)的值的一個(gè)拷貝傳遞給方法中的形式參數(shù),方法調(diào)用結(jié)束后實(shí)際參數(shù)的值并不改變。方法參數(shù)傳遞Java語言程序設(shè)計(jì)(第4版)清華大學(xué)出版社當(dāng)參數(shù)是基本類型時(shí),將實(shí)際參數(shù)值的一個(gè)拷貝傳遞給方法,方法調(diào)用結(jié)束后,對(duì)原來的值沒有影響。當(dāng)參數(shù)是引用類型時(shí),實(shí)際傳遞的是引用值,因此在方法的內(nèi)部有可能改變?cè)瓉淼膶?duì)象。注意:如果為方法傳遞的是不可變的引用類型對(duì)象(如String對(duì)象),對(duì)象在方法內(nèi)部不可能被改變。publicstaticvoidchange(intnum){num=num*2;System.out.println(num);//輸出:200}publicstaticvoidchange(Employeeemp){//在方法體中修改員工的工資emp.setSalary(8000);System.out.println(emp.getSalary());//輸出:8000}程序4.5PassByValue.javapublicstaticvoidmain(String[]args){intnumber=100;change(number);System.out.println(number);//輸出:100Employeeemployee=newEmployee();employee.setSalary(5000);change(employee);//方法調(diào)用后輸出員工的工資System.out.println(employee.getSalary());//輸出:8000}Java語言程序設(shè)計(jì)案例:分?jǐn)?shù)類Fraction的設(shè)計(jì)分?jǐn)?shù)(fraction),也稱為有理數(shù)(rationalnumber),是兩個(gè)整數(shù)的比值,如3/4、1/2和7/5等??梢远x一個(gè)類,通過指定兩個(gè)整型成員實(shí)現(xiàn)一個(gè)分?jǐn)?shù)類,并且定義分?jǐn)?shù)的運(yùn)算方法。這兩個(gè)成員一個(gè)是numer,表示分子,一個(gè)是denom,表示分母。Fraction類設(shè)計(jì)定義一個(gè)類,還需要考慮約束條件,比如對(duì)于分?jǐn)?shù)有如下三個(gè)條件:分母不能為0。類似于2/0的分?jǐn)?shù)沒有定義。分?jǐn)?shù)的符號(hào)由分子符號(hào)和分母符號(hào)共同決定,并且應(yīng)設(shè)置為分子的符號(hào)。分子和分母不應(yīng)該具有公因數(shù)。例如,6/9應(yīng)該化簡為2/3。publicclassFraction{privateintnumer;privateintdenom;

publicFraction(){

this.numer=0;

this.denom=1;

}publicFraction(intnumer){

this.numer=numer;

this.denom=1;}程序4.6Fraction.javapublicFraction(intnumer,intdenom){

this.numer=numer;

this.denom=denom;normalize();}publicintgetNumer(){returnnumer;}publicintgetDenom(){returndenom;}publicFractionadd(Fractionfr){Fractiontemp=newFraction();temp.numer=numer*fr.denom+denom*fr.numer;temp.denom=denom*fr.denom;temp.normalize();

returntemp;}publicFractionsubtract(Fractionfr){Fractiontemp=newFraction();temp.numer=numer*fr.denom-denom*fr.numer;temp.denom=denom*fr.denom;temp.normalize();

returntemp;

}

publicFractionmultiply(Fractionfr){Fractiontemp=newFraction();temp.numer=numer*fr.numer;temp.denom=denom*fr.denom;temp.normalize();

returntemp;

}

publicFractiondivide(Fractionfr){Fractiontemp=newFraction();temp.numer=numer*fr.denom;temp.denom=denom*fr.numer;temp.normalize();

returntemp;

}

privateintgcd(intn,intm){

intgcd=1;

for(intk=1;k<=n&&k<=m;k++){

if(n%k==0&&m%k==0){gcd=k;

}

}

returngcd;

}privatevoidnormalize(){

if(denom==0){

thrownewRuntimeException("分?jǐn)?shù)分母不能為0!");

}

//改變分子的正負(fù)號(hào)

if(denom<0){denom=-denom;numer=-numer;

}

//使用最大公約數(shù)整除分子和分母

intdivisor=gcd(Math.abs(numer),Math.abs(denom));numer=numer/divisor;denom=denom/divisor;}@OverridepublicStringtoString(){Strings="";

if(denom==1||numer==0){returns+numer;}else{

returns+numer+"/"+denom;//3/5

}

}publicstaticvoidmain(String[]args){Fractiona=newFraction(3,-8);Fractionb=newFraction(21,15);System.out.println(a);System.out.println(b);System.out.println("a+b="+a.add(b));System.out.println("a-b="+a.subtract(b));System.out.println("a*b="+a.multiply(b));System.out.println("a/b="+a.divide(b));

}Java語言程序設(shè)計(jì)靜態(tài)變量和靜態(tài)方法如果成員變量用static修飾,則該變量稱為靜態(tài)變量或類變量(classvariable),否則稱為實(shí)例變量(instancevariable)。概述如果成員方法用static修飾,則該方法稱為靜態(tài)方法或類方法(classmethod),否則稱為實(shí)例方法(instancemethod)。6.1.1靜態(tài)變量Java語言程序設(shè)計(jì)(第4版)

QQ群:288639486靜態(tài)變量:

用static修飾,也叫類變量。

所有實(shí)例共享一塊內(nèi)存空間。

通常使用類名訪問。實(shí)例變量:

未用static修飾。

每個(gè)實(shí)例具有自己的內(nèi)存空間。

必須使用實(shí)例名訪問。6.1.1靜態(tài)變量Java語言程序設(shè)計(jì)(第4版)

QQ群:288639486c1:Counterx:100

:Counterx:100

y:200

c2Counterc1=newCounter();Counterc2=newCounter();c1.y=100;c2.y=200;c1.y?6.1.1靜態(tài)變量Java語言程序設(shè)計(jì)(第4版)

QQ群:288639486通常,static與final一起使用來定義類常量。例如,Java類庫中的Math類中就定義了兩個(gè)類常量:

publicstaticfinaldoubleE=2.718281828459045;publicstaticfinaldoublePI=3.141592653589793;可以通過類名直接使用這些常量。6.1.1靜態(tài)方法Java語言程序設(shè)計(jì)(第4版)

QQ群:288639486靜態(tài)方法:

用static修飾,也叫類方法。

只能訪問靜態(tài)變量。

通常使用類名訪問。實(shí)例方法:

未用static修飾。

可訪問實(shí)例變量和靜態(tài)變量。

必須使用實(shí)例名調(diào)用。6.1.1靜態(tài)方法Java語言程序設(shè)計(jì)(第4版)

QQ群:288639486實(shí)例方法實(shí)例方法調(diào)用√實(shí)例變量訪問√靜態(tài)方法調(diào)用√靜態(tài)變量訪問√靜態(tài)方法實(shí)例方法調(diào)用×實(shí)例變量訪問×靜態(tài)方法調(diào)用√靜態(tài)變量訪問√我們知道使用new創(chuàng)建對(duì)象。但是,Java類庫中的一些類不能以這種方式實(shí)例化。例如,不能使用new創(chuàng)建java.time.LocalDate類的實(shí)例,因?yàn)樗臉?gòu)造方法是私有的。然而,可以使用它的一個(gè)靜態(tài)方法。靜態(tài)工廠方法例如now創(chuàng)建該類實(shí)例:

LocalDatetoday=LocalDate.now();這種方法稱為靜態(tài)工廠方法(staticfactorymethod)。我們自己也可以設(shè)計(jì)帶靜態(tài)工廠方法的類。定義一個(gè)Discount類,這是一個(gè)簡單的類,它有一個(gè)私有構(gòu)造方法。類中有一個(gè)表示折扣率的int型字段,這個(gè)值可以是10(小客戶),也可以是12(大客戶)。它帶一個(gè)getValue方法(返回value)和兩個(gè)靜態(tài)工廠方法:createSmallCustomerDiscount和createBigCustomerDiscount。靜態(tài)工廠方法注意,靜態(tài)工廠方法可以調(diào)用私有構(gòu)造方法來創(chuàng)建對(duì)象,因?yàn)樗鼈兾挥谕粋€(gè)類中。使用這種設(shè)計(jì),就可以將Discount對(duì)象限制為只使用10或12,而不允許使用其他值。publicclassDiscount{privateintvalue;privateDiscount(intvalue){this.value=value;}publicintgetValue(){returnthis.value;}publicstaticDiscountcreateSmallCustomerDiscount(){returnnewDiscount(10);}程序4.10Discount.javapublicstaticDiscountcreateBigCustomerDiscount(){returnnewDiscount(12);}publicstaticvoidmain(String[]args){Discountdiscount=Discount.createBigCustomerDiscount();System.out.println(discount.getValue());//12}在Java類的設(shè)計(jì)中,有時(shí)希望一個(gè)類在任何時(shí)候只能有一個(gè)實(shí)例。這時(shí)可以將該類設(shè)計(jì)為單例模式(singleton)。單例模式要將一個(gè)類設(shè)計(jì)為單例模式,類的構(gòu)造方法的訪問修飾符應(yīng)聲明為private,然后在類中定義一個(gè)static方法,在該方法中創(chuàng)建類的對(duì)象。publicfinalclassSun{

privatestaticfinalSunINSTANCE=newSun();

privateinta=0;privateSun(){}//構(gòu)造方法

publicstaticsynchronizedSungetInstance(){

returnINSTANCE;

}

publicvoidmethodA(){a++;System.out.println("a="+a);

}程序4.11Sun.java

publicstaticvoidmain(String[]args){Sunsun1=Sun.getInstance();Sunsun2=Sun.getInstance();sun1.methodA();sun2.methodA();System.out.println(sun1==sun2);//返回true表示引用同一實(shí)例

}遞歸(recursion)是解決復(fù)雜問題的一種常見方法。其基本思想就是把問題逐漸簡單化,最后實(shí)現(xiàn)問題的求解。方法遞歸例如,求正整數(shù)n的階乘n!,就可以通過遞歸實(shí)現(xiàn)。n!可按遞歸定義如下:n!=n×(n-1)!;n>00!=1;Java語言支持方法的遞歸調(diào)用。所謂方法的遞歸調(diào)用就是方法自己調(diào)用自己。方法遞歸設(shè)計(jì)算n!的方法為factor(n),則該算法的簡單描述如下:if(n==0)return1;

elsereturnfactor(n-1)*n;

publicstaticlongfactor(intn){

if(n==0)

return1;

else

returnn*factor(n-1);

}

publicstaticvoidmain(String[]args){

intk=20;System.out.println(k+"!="+factor(k));System.out.println("max="+Long.MAX_VALUE);//long型數(shù)的最大值

}程序4.12RecursionDemo.javaJava語言程序設(shè)計(jì)案例:打印斐波那契數(shù)列斐波那契數(shù)列(Fibonaccisequence),又稱黃金分割數(shù)列,是意大利數(shù)學(xué)家列昂納多·斐波那契(LeonardoFibonacci)提出,它指的是這樣一個(gè)數(shù)列,前兩個(gè)數(shù)都是1,后面的每個(gè)數(shù)是前面兩個(gè)數(shù)的和,依次類推下去:也就是1、1、2、3、5、8、13、21、34、……。在這個(gè)數(shù)列中的數(shù),被稱為斐波那契數(shù)。問題描述斐波那契數(shù)列在很多領(lǐng)域都有應(yīng)用,自然界存在很多斐波那契數(shù),如樹的葉子數(shù)、向日葵的花瓣數(shù)等。研究發(fā)現(xiàn),斐波那契數(shù)還有很多有趣的現(xiàn)象,比如當(dāng)數(shù)較大時(shí),前一項(xiàng)與后一項(xiàng)的比值越來越逼近黃金分割比0.618。要求使用方法遞歸,計(jì)算并輸出前20項(xiàng)斐波那契數(shù),并計(jì)算最后兩項(xiàng)的比值。在數(shù)學(xué)上,斐波那契數(shù)列可按如下以遞歸的方式定義:F(1)=1,F(xiàn)(2)=1,

F(n)=F(n-1)+F(n-2),(n

≥3,n

為自然數(shù))根據(jù)上述定義,我們可以編寫下面方法計(jì)算第n個(gè)斐波那契數(shù)。打印斐波那契數(shù)列

publicstaticlongfib(intn){

if(n==1||n==2){

return1;}else{

returnfib(n-1)+fib(n-2);}

}打印斐波那契數(shù)列

publicstaticlongfib(intn){

if(n==1||n==2){

return1;}else{

returnfib(n-1)+fib(n-2);}

}publicstaticvoidmain(String[]args){for(inti=1;i<=20;i++){System.out.println("fib("+i+")="+fib(i));}System.out.println("fib(19)/fib(20)="+fib(19)*1.0/fib(20));}程序4.13FibonacciNumber.javaJava語言程序設(shè)計(jì)對(duì)象初始化6.1.1實(shí)例變量初始化Java語言程序設(shè)計(jì)(第4版)

QQ群:288639486實(shí)例變量的初始化有下面幾種方式:

1)聲明時(shí)初始化。2)使用初始化塊。3)使用構(gòu)造方法初始化。在類的定義中如果沒有為變量賦初值,則編譯器為每個(gè)成員變量指定一個(gè)默認(rèn)值。

引用類型的變量,默認(rèn)值為null。

基本類型,整型默認(rèn)值是0,浮點(diǎn)型默認(rèn)值是0.0,布爾型默認(rèn)值是false,字符型是空字符(’\u0000’)6.1.1實(shí)例變量初始化Java語言程序設(shè)計(jì)(第4版)publicclassStudent{intid;Stringname;doublemarks;booleanpass;}Students=newStudent();s.display();s:Studentid:0name:nullmarks:0.0pass:false6.1.1實(shí)例變量初始化Java語言程序設(shè)計(jì)(第4版)publicclassStudent{intid=1001;Stringname="李明";doublemarks=90.5;booleanpass=true;}Students=newStudent();s.display();s:Studentid:1001name:李明marks:90.5pass:true6.1.1初始化次序Java語言程序設(shè)計(jì)(第4版)如果在類中既為實(shí)例變量指定了初值,又有初始化塊,還在構(gòu)造方法中初始化了變量,那么它們執(zhí)行的順序如何,最后變量的值是多少?1)首先使用默認(rèn)值或指定的初值初始化,這里先將x賦值為100。2)接下來執(zhí)行初始化塊,重新將x賦值為60。3)最后再執(zhí)行構(gòu)造方法,再重新將x賦值為58。

intx=100;{x=60;System.out.println("初始化塊中x="+x);}publicInitDemo(){x=58;System.out.println("構(gòu)造方法中x="+x);} publicstaticvoidmain(String[]args){InitDemod=newInitDemo();System.out.println("對(duì)象創(chuàng)建后x="+d.x);}程序4.15InitDemo.java6.1.1靜態(tài)變量的初始化Java語言程序設(shè)計(jì)(第4版)

QQ群:288639486靜態(tài)變量的初始化有下面幾種方法:1)聲明時(shí)初始化。2)使用靜態(tài)初始化塊。3)使用構(gòu)造方法初始化。對(duì)于static變量除了可以使用前兩種方法初始化外,還可以使用靜態(tài)初始化塊。靜態(tài)初始化塊是在初始化塊前面加上static關(guān)鍵字。例如,下面的類定義就使用了靜態(tài)初始化塊。靜態(tài)初始化塊注意,在靜態(tài)初始化塊中只能使用靜態(tài)變量(就像靜態(tài)方法中只能使用靜態(tài)變量和調(diào)用靜態(tài)方法一樣),不能使用實(shí)例變量。靜態(tài)變量是在類裝載時(shí)初始化的,因此在產(chǎn)生對(duì)象前就初始化了,這也就是可以使用類名訪問靜態(tài)變量的原因。publicclassStaticDemo{staticintx=100;static{x=48;}publicStaticDemo{x=88;}//其他代碼}靜態(tài)初始化塊當(dāng)一個(gè)類有多種初始化方法時(shí),執(zhí)行順序是:(1)用默認(rèn)值給靜態(tài)變量賦值,然后執(zhí)行靜態(tài)初始化塊為static變量賦值。(2)用默認(rèn)值給實(shí)例變量賦值,然后執(zhí)行初始化塊為實(shí)例變量賦值。(3)最后使用構(gòu)造方法初始化靜態(tài)變量或?qū)嵗兞?。靜態(tài)初始化塊Java語言程序設(shè)計(jì)變量的作用域在Java中有多個(gè)地方可以使用變量,如類的成員變量、方法的局部變量、代碼塊中聲明的變量(如for語句以及異常處理塊等)。變量的作用域變量的作用域(scope)是指一個(gè)變量可以在程序的什么范圍內(nèi)使用。Java程序的作用域是通過塊實(shí)現(xiàn)的,塊是使用一對(duì)花括號(hào)括起來的語句序列,塊可對(duì)語句進(jìn)行分組并定義變量的作用域。一般來說,變量只在其聲明的塊中可見,在塊外不可見。若一個(gè)變量屬于某個(gè)作用域,它在該作用域可見,即可被訪問,否則不能被訪問。變量的生存期(lifetime)是指變量被分配內(nèi)存的時(shí)間期限。當(dāng)聲明一個(gè)方法局部變量時(shí),系統(tǒng)將為該變量分配內(nèi)存,只要方法沒有返回,該變量將一直保存在內(nèi)存中。一旦方法返回,該變量將從內(nèi)存棧中清除,它將不能再被訪問。變量的作用域?qū)τ趯?duì)象,當(dāng)使用new創(chuàng)建對(duì)象時(shí),系統(tǒng)將在堆中分配內(nèi)存。當(dāng)一個(gè)對(duì)象不再被引用時(shí),對(duì)象和內(nèi)存將被回收。但不是對(duì)象離開作用域就立即被回收。實(shí)際上是在之后某個(gè)時(shí)刻當(dāng)垃圾回收器運(yùn)行時(shí)才被回收。publicclassScopeDemo{inti=100;int[]a={1,2,3,4};publicvoidmethod(intn){inti=3;for(intj=0;j<3;j++){a[j]=0;}while(i>0){inttmp=i*i;a[i]=a[i]+tmp;i--;}程序4.16ScopeDemo.javaEmployeec=newEmployee();System.out.println(i);System.out.println(this.i);System.out.println(n+8);}publicstaticvoidmain(String[]args){newScopeDemo().method(10);}Java語言程序設(shè)計(jì)局部變量類型推斷在方法中聲明一個(gè)引用類型變量并使用構(gòu)造方法創(chuàng)建對(duì)象時(shí),需要兩次輸入變量類型,第一次用于聲明變量類型,第二次用于調(diào)用構(gòu)造方法,比如:

Employeeemp=newEmployee("張三",28,800);局部變量類型推斷從Java10開始,開發(fā)人員可以使用var關(guān)鍵字聲明一個(gè)局部變量,然后通過構(gòu)造方法或工廠方法創(chuàng)建對(duì)象,在創(chuàng)建對(duì)象時(shí)讓編譯器自己去推斷類型,從而確定變量的類型。

varemp=newEmployee("張三",28,800);var實(shí)際上作為類型占位符(typeholder)。編譯器在處理var時(shí),先查看表達(dá)式右邊部分,也就是所謂的構(gòu)造器,來確定變量的類型。這樣避免了信息冗余,程序員可以少輸入一些字符,而且還可以對(duì)齊變量名,使程序更容易閱讀。局部變量類型推斷不是在任何時(shí)候都可使用var聲明變量,它只能用在局部變量聲明并創(chuàng)建時(shí),更準(zhǔn)確地說,是那些帶有構(gòu)造器的局部變量聲明。下面用法不正確。varemp;emp=newEmployee("張三",28,800);字符串類型也是引用類型,下面用法是正確的:

溫馨提示

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

評(píng)論

0/150

提交評(píng)論