面向?qū)ο筇卣鱛第1頁
面向?qū)ο筇卣鱛第2頁
面向?qū)ο筇卣鱛第3頁
面向?qū)ο筇卣鱛第4頁
面向?qū)ο筇卣鱛第5頁
已閱讀5頁,還剩174頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

面向?qū)ο筇卣鞯谌旅嫦驅(qū)ο筇卣骰靖拍頙ava中類的定義對象類的繼承和多態(tài)接口常用工具類第2頁,共179頁,2024年2月25日,星期天基本概念什么是編程語言?人和計算機進行交流的工具和手段編程語言的發(fā)展第一代語言:機器語言:0101001第二代語言:匯編語言:mov,push,add,call第三代語言:高級語言,以C語言為代表,過程化編程語言(ProceduralProgrammingLanguage)

特點:程序=算法+數(shù)據(jù)結(jié)構(gòu)第四代語言:非過程化/面向?qū)ο蟮木幊陶Z言語言的發(fā)展:抽象的過程第3頁,共179頁,2024年2月25日,星期天基本概念過程化編程模式數(shù)據(jù)和函數(shù)(過程)是分開的,即開發(fā)人員看到的是函數(shù)或過程的集合以及一批單獨的數(shù)據(jù)處理過程:參數(shù)輸入函數(shù)/過程代碼結(jié)果輸出編程模式:函數(shù)1函數(shù)2函數(shù)3數(shù)據(jù)1數(shù)據(jù)2數(shù)據(jù)3數(shù)據(jù)4數(shù)據(jù)5……缺點:牽一發(fā)而動全身第4頁,共179頁,2024年2月25日,星期天基本概念面向?qū)ο缶幊棠J匠绦虮豢醋魇窍嗷f(xié)作的對象集合第5頁,共179頁,2024年2月25日,星期天面向?qū)ο?ObjectOriented-OO)面向?qū)ο蟮乃枷雽⒖陀^事物看作具有狀態(tài)和行為的對象,通過抽象找出同一類對象的共同狀態(tài)和行為,構(gòu)成類。第一個面向?qū)ο蟮恼Z言:Simula-67(80年代初)第一個成功的面向?qū)ο缶幊陶Z言:SmalltalkC++(1986年),JAVA(1995年),C#,PERL等用客觀世界中描述事物的方法來描述程序中要解決的問題萬事萬物都是對象程序便是成堆的對象,彼此通過消息的傳遞,請求其他對象進行工作基本概念第6頁,共179頁,2024年2月25日,星期天五個基本概念對象類封裝性繼承性多態(tài)性基本概念第7頁,共179頁,2024年2月25日,星期天對象(object)everythingisanobject.現(xiàn)實世界的對象:桌子、書、自行車、電視、狗、文件、表格、按鈕、窗口對象包含兩個特性狀態(tài):指對象本身的信息(內(nèi)部信息/內(nèi)部變量)行為:實現(xiàn)對信息的訪問/對象的操作一輛自行車的狀態(tài)(型號:鳳凰26、顏色:黑、速度:0,擋數(shù):5),行為(剎車、加速、減速和換擋)一只圓的狀態(tài)(名字:myCircle,半徑:3.0,圓心(1.0,1.0)

等),行為(求周長、求面積、判斷給定的一點是否在圓內(nèi)等)一個程序窗口的狀態(tài)(名稱:MyWindow,大?。?40×480,位置:(0,0),顏色:灰等),行為(關(guān)閉、打開、最小化、最大化,調(diào)整大小,移動等)基本概念第8頁,共179頁,2024年2月25日,星期天對象兩個特性的表示方法:狀態(tài)

變量(variables)

行為

方法(method)對象就是變量和相關(guān)方法的軟件集合一個對象可以由其他對象組合而成,窗口(按鈕,菜單條,文本框,狀態(tài)欄等)程序就是對象的集合,對象之間相互交互和通信完成任務(wù)搭積木一個程序就是一堆對象的集合,這些對象之間通過發(fā)布消息進行交互?;靖拍畹?頁,共179頁,2024年2月25日,星期天類(class)現(xiàn)實世界中,存在很多同類的對象,很多桌子、書、自行車,把每一類對象共有的狀態(tài)和行為進行抽象,形成對象的一個模板,這就是類。類是構(gòu)造對象的模板或藍圖。就像建筑物與設(shè)計圖紙的關(guān)系一樣,通過一份設(shè)計圖紙,可以建造出很多建筑物。表格(類)填入不同的個人信息

不同的對象對象是某個類的一個實例,類是許多對象的一個抽象編寫程序時,實際上是在編寫類代碼,對象只有程序運行時才存在?;靖拍畹?0頁,共179頁,2024年2月25日,星期天基本概念抽象性

把眾多的事物進行歸納、分類是人們在認識客觀世界時經(jīng)常采用的思維方法,“物以類聚,人以群分”就是分類的意思,分類所依據(jù)的原則是抽象。抽象(Abstract)就是忽略事物中與當前目標無關(guān)的非本質(zhì)特征,更充分地注意與當前目標有關(guān)的本質(zhì)特征。從而找出事物的共性,并把具有共性的事物劃為一類,得到一個抽象的概念。第11頁,共179頁,2024年2月25日,星期天4.封裝性封裝就是把對象的屬性和行為結(jié)合成一個獨立的單位,并盡可能隱蔽對象的內(nèi)部細節(jié)。封裝有兩個含義:一是把對象的全部屬性和行為結(jié)合在一起,形成一個不可分割的獨立單位。對象的屬性值(除了公有的屬性值)只能由這個對象的行為來讀取和修改;二是盡可能隱蔽對象的內(nèi)部細節(jié),對外形成一道屏障,與外部的聯(lián)系只能通過外部接口實現(xiàn)。好處對象本身的數(shù)據(jù)得到保護/隱藏其它對象僅僅需要知道對該對象的訪問方法(接口/interface)即可使用模塊化--每個對象的源文件可以是相互獨立的,可以被不同的程序調(diào)用,每個對象是一塊積木,可以搭建不同的形狀可重用性例子電腦的DIY噴墨打印機,硒鼓壞/彩色硒鼓基本概念第12頁,共179頁,2024年2月25日,星期天5.繼承性為什么會有繼承?建立一個類后,發(fā)現(xiàn)另一個新的類有相同的特性,兩個選擇:(1)重新定義一個新的類;(2)在已有類的基礎(chǔ)上修改(加加/減減)新的對象類由繼承原有對象類的某些特性或全部特性而產(chǎn)生出來,原有對象類稱為基類(或超類、父類),新的對象類稱為派生類(或子類),派生類可以直接繼承基類的共性,又允許派生類發(fā)展自己的個性。繼承性簡化了對新的對象類的設(shè)計。樹型結(jié)構(gòu)(層次化結(jié)構(gòu))根(基類)基本概念第13頁,共179頁,2024年2月25日,星期天5.繼承性運輸工具航空運輸工具陸地運輸工具水上運輸工具人力驅(qū)動引擎驅(qū)動二輪四輪客運貨運基本概念第14頁,共179頁,2024年2月25日,星期天6.多態(tài)性多態(tài)性是指不同類型的對象可以對相同的激勵做出適當?shù)牟煌憫?yīng)的能力。多態(tài)性豐富了對象的內(nèi)容,擴大了對象的適應(yīng)性,改變了對象單一繼承的關(guān)系。表現(xiàn)在繼承中方法的重寫子類從父類繼承(extends擴展)而來多個子類同屬一個父類,所有子類有相同的父類繼承父類的方法在不同的子類中有不同的表現(xiàn)形式表現(xiàn)在用一個類中方法的重載基本概念第15頁,共179頁,2024年2月25日,星期天6.多態(tài)性多態(tài)性在繼承中的表現(xiàn)基本概念第16頁,共179頁,2024年2月25日,星期天第三章面向?qū)ο筇卣骰靖拍頙ava中類的定義對象類的繼承和多態(tài)接口常用工具類第17頁,共179頁,2024年2月25日,星期天程序是對象的集合,而對象是類的實例化源程序就是一個個的Java類類有兩種:(1)Java本身提供的類(核心API)見Java文檔中描述程序員可以對其進行調(diào)用j2sdk1.5.0_06\jre\lib\rt.jar(32.1MB)(2)程序員自己定義的類Java中類的定義第18頁,共179頁,2024年2月25日,星期天Java中類的定義最簡單的類class類名{//類中的代碼}例如:classStudent{ Stringsname;//姓名

intsage;//年齡

Stringsclass;//班級}用Student類創(chuàng)建對象:Studenttom=newStudent();第19頁,共179頁,2024年2月25日,星期天publicclassStudentExample{ publicstaticvoidmain(Stringargs[]){ Studenttom=newStudent(); Studentjerry=newStudent();

tom.sage=21;

tom.sname="Tom";

tom.sclass="97402";

jerry.sage=23;

jerry.sname="Jerry";

jerry.sclass="97403"; System.out.println("sname="+tom.sname+",sage="+tom.sage+",sclass="+tom.sclass); System.out.println("sname="+jerry.sname+",sage="+jerry.sage+",sclass="+jerry.sclass); }}第20頁,共179頁,2024年2月25日,星期天類的基本定義格式[類的修飾符]class

類名{

類型 成員變量1;

類型 成員變量2;

類型 成員方法1(參數(shù)1,[參數(shù)2,…]){

方法體; }

類型 成員方法2(參數(shù)1,[參數(shù)2,…]){

方法體; }

…}Java中類的定義第21頁,共179頁,2024年2月25日,星期天Java中類的定義classCircle{doubler;publicvoidsetR(doubler1){ r=r1; }publicdoublecircumference(){ returnMath.PI*2*r;}publicdoublearea(){ returnMath.PI*r*r;}}publicclassCalCircle{ publicstaticvoidmain(String[]args){ Circlec=newCircle(); c.setR(10.0); System.out.println("圓的面積是"+c.area()); System.out.println("圓的周長是"+c.circumference()); } }第22頁,共179頁,2024年2月25日,星期天在實際項目開發(fā)中,往往需要開發(fā)很多不同的類,能否方便高效地組織這些類,對項目的開發(fā)與使用具有很重要的意義。Java中提供包(Package)將不同類組織起來進行管理,借助于包可以方便地組織自己的類代碼,并將自己的代碼與別人提供的代碼庫分開管理。使用包的目的之一就是可以在同一個項目中使用名稱相同的類,假如兩個開發(fā)人員不約而同地建立了兩個相同名字的類,只要將其放置在不同的包中,就不會產(chǎn)生沖突。包(package)第23頁,共179頁,2024年2月25日,星期天包(package)包的命名每個包的名稱必須是“獨一無二”的例如:java.langjava.utilmypackage.imageJava中包名使用小寫字母表示命名方式建議把大的組織名稱寫到前面,逐漸縮小范圍例如:云南省所有大學生合作來編寫某大型程序:ynu.sise.cs.cs2002.zhangsanynu.sise.cs.cs2003.lisi第24頁,共179頁,2024年2月25日,星期天包(package)包的聲明命名的包(NamedPackages)例如:

packagemypackage.graphic;package語句必須放在源文件的最前面,其之前不可以有其他任何語句。每個源文件中最多有一句package語句,因為一個類不可能屬于兩個包,就如同不能把一件衣服同時放進兩個箱子一樣。默認包(未命名的包)不含有包聲明的編譯單元是默認包的一部分包與目錄Java使用文件系統(tǒng)來存儲包和類包名就是文件夾名,即目錄名目錄名并不一定是包名用javac編譯源程序時,如遇到當前目錄(包)中沒有聲明的類,就會以環(huán)境變量classpath為相對查找路徑,按照包名的結(jié)構(gòu)來查找。因此,要指定搜尋包的路徑,需設(shè)置環(huán)境變量classpath第25頁,共179頁,2024年2月25日,星期天包(package)引入包為了使用其它包中所提供的類,需要使用import語句引入所需要的類Java編譯器為所有程序自動引入包java.langimport語句的格式

importpackage1[.package2…].(classname|*);其中package1[.package2…]表明包的層次,它對應(yīng)于文件目錄classname則指明所要引入的類名如果要引入一個包中的所有類,則可以使用星號(*)來代替類名第26頁,共179頁,2024年2月25日,星期天包(package)//Circle.javapackagemypackage.graphic;publicclassCircle{doubler;publicvoidsetR(doubler1){ r=r1; }publicdoublecircumference(){ returnMath.PI*2*r;}publicdoublearea(){ returnMath.PI*r*r;}}//CalCircle.javaimportmypackage.graphic.Circle;publicclassCalCircle{ publicstaticvoidmain(String[]args){

Circlec=newCircle(); c.setR(10.0); System.out.println("圓的面積是"+c.area()); System.out.println("圓的周長是"+c.circumference()); } }第27頁,共179頁,2024年2月25日,星期天如何防止名字沖突//myGraphics.CirclepackagemyGraphics; publicclassCircle{doubler;}//yourGraphics.CirclepackageyourGraphics;publicclassCircle{doubler;}包(package)importmyGraphics.*;importyourGraphics.*;publicclassTest{ publicstaticvoidmain(Stringargs[]){

Circlec=newCircle(); //那個Circle?

}}importmyGraphics.*;importyourGraphics.*;publicclassTest{ publicstaticvoidmain(Stringargs[]){ //Circlec=newCircle();

myGraphics.Circlec1=newmyGraphics.Circle();

yourGraphics.Circlec2=newyourGraphics.Circle();}}第28頁,共179頁,2024年2月25日,星期天類的定義格式[類的修飾符]class

類名{

}類的訪問權(quán)限修飾符public:公共類,可以被其他類所訪(無任何限制)無修飾/默認說明:僅能被同一個包中的其他類訪問在同一個.java文件中,只能有一個public修飾的類,這個類一般為主類(包含main方法的類)。Java中類的描述第29頁,共179頁,2024年2月25日,星期天一個簡單的類publicclassStudent{ Stringname,stuNumber; doublescore1,score2,score3; voidsetName(Strings1){ name=s1; } voidsetStuNumber(Strings2){ stuNumber=s2; } voidsetScore(doubled1,doubled2,doubled3){ doubled; score1=d1; score2=d2; score3=d3; }doublegetAverage(){return(d1+d2+d3)/3;}}Java中類的描述第30頁,共179頁,2024年2月25日,星期天對象具有狀態(tài)和行為成員變量定義[訪問權(quán)限修飾符]類型變量名;[訪問權(quán)限修飾符]類型變量名[=初值];[訪問權(quán)限修飾符]類型變量名[=初值][,變量名[= 初值]…];成員方法定義[訪問權(quán)限修飾符]方法返回類型方法名(){

方法體;}類型:基本類型,復(fù)合類型(數(shù)組、類和接口)類成員-變量和方法第31頁,共179頁,2024年2月25日,星期天訪問控制修飾符公共訪問控制符-public被所有類訪問(相當于公共設(shè)施,人人能用)默認訪問控制符被同一包中其他類訪問(包外的子類訪問不到)(相當于某個工作單位設(shè)施,只能本單位的人能用,子女不能用)私有訪問控制符-private只能被該類自身訪問(相當于私人物品,只有自己能用)保護訪問控制符-protected該類自身、同一個包中的其他類、其他包中的子類訪問(相當于家庭物品,家里人能用,外人不能用)類成員方法的訪問第32頁,共179頁,2024年2月25日,星期天public(公共變量/公共方法)容許全權(quán)訪問,無任何限制(先構(gòu)造對象,再訪問)//Circle.javapublicclassCircle{publicdoubleradius;

publicdoublecircumference(){return2*Math.PI*radius;}}//CircumferenceTester.javapublicclassCircumferenceTester

{publicstaticvoidmain(Stringargs[]){Circlec1=newCircle();

c1.radius=50;//可以直接訪問

Circlec2=newCircle();

c2.radius=10;//可以直接訪問

doublecircum1=c1.circumference();doublecircum2=c2.circumference();System.out.println("Circle1hascircumference"+circum1);System.out.println("Circle2hascircumference"+circum2);}}類成員方法的訪問第33頁,共179頁,2024年2月25日,星期天private(私有變量/私有方法)僅能在其所定義的類中被訪問(先構(gòu)造對象,再訪問)//Circle.javapublicclassCircle{privatedoubleradius;publicdoublecircumference(){return2*Math.PI*radius;}}//CircumferenceTester.javapublicclassCircumferenceTester

{publicstaticvoidmain(Stringargs[]){Circlec1=newCircle();

c1.radius=50;

Circlec2=newCircle();

c2.radius=10;

doublecircum1=c1.circumference();doublecircum2=c2.circumference();System.out.println("Circle1hascircumference"+circum1);System.out.println("Circle2hascircumference"+circum2);}}類成員方法的訪問第34頁,共179頁,2024年2月25日,星期天類成員方法的訪問編譯時會提示出錯在編譯語句“c1.radius=50;”及“c2.radius=10;”時會提示存在語法錯誤“radiushasprivateaccessinCircle”說明由于在Circle類聲明中變量radius被聲明為private,因此在其它類中不能直接對radius進行存取如果要允許其它類訪問radius的值,就需要在Circle類中聲明相應(yīng)的公有方法。通常有兩類典型的方法用于訪問屬性值,get方法及set方法第35頁,共179頁,2024年2月25日,星期天類成員方法的訪問get方法功能是取得屬性變量的值get方法名以“get”開頭,后面是實例變量的名字一般具有以下格式:public<fieldType>get<FieldName>(){return<fieldName>;}對于實例變量radius,聲明其get方法如下:publicdoublegetRadius(){returnradius;}第36頁,共179頁,2024年2月25日,星期天類成員方法的訪問set方法功能是修改屬性變量的值set方法名以“set”開頭,后面是實例變量的名字一般具有以下格式publicvoidset<FieldName>(<fieldType><paramName>){<fieldName>=<paramName>;}聲明實例變量radius的set方法如下:publicvoidsetRadius(doubler){

if(r>=0)radius=r;elseSystem.out.println(“半徑輸入錯誤”);}第37頁,共179頁,2024年2月25日,星期天//Circle.javapublicclassCircle{privateintradius;publicvoidsetRadius(doubler){

if(r>=0)radius=r;elseSystem.out.println(“半徑輸入錯誤”);}publicdoublegetRadius(){returnradius;}publicdoublecircumference(){return2*3.14*radius;}}//CircumferenceTester.javapublicclassCircumferenceTester

{publicstaticvoidmain(Stringargs[]){Circlec1=newCircle();c1.setRadius(50);Circlec2=newCircle();c2.setRadius(10);doublecircum1=c1.circumference();doublecircum2=c2.circumference();System.out.println("Circle1hascircumference"+circum1);System.out.println("Circle2hascircumference"+circum2);}}第38頁,共179頁,2024年2月25日,星期天無修飾(友好變量/友好方法)容許與此成員所屬類在同一個包中所有類訪問也就是說,對于同一個包中的類,無修飾類型相當于public,而對于包外的類則相當于private例子:試把前面的Circle.java中的求面積,求周長的方法的訪問權(quán)限改為無修飾類型類成員方法的訪問第39頁,共179頁,2024年2月25日,星期天protected(保護變量/保護方法)容許同一個包中所有類以及子類(有一定限制)訪問(先構(gòu)造對象,再訪問)其實就是在無修飾類型訪問權(quán)限的基礎(chǔ)上再增加子類例子:略,講繼承時補充類成員方法的訪問第40頁,共179頁,2024年2月25日,星期天類成員方法的訪問類屬性與方法public默認

publicAB

protectedB+CB默認BB

privateDD訪問控制修飾符歸納第41頁,共179頁,2024年2月25日,星期天非訪問控制修符靜態(tài)成員修飾符static靜態(tài)方法:屬于類的方法靜態(tài)變量:屬于類的變量最終成員修飾符final最終方法:不能被子類重新定義的方法最終變量:值不能修改的變量抽象方法修飾符abstract抽象方法:只有方法說明,沒有具體實現(xiàn)類成員方法的訪問第42頁,共179頁,2024年2月25日,星期天方法的重載(overload)方法名相同,但方法的參數(shù)不同(數(shù)量,類型,順序)求最大值定義:doublemax(doublea,doubleb)doublemax(doublea,doubleb,doublec)doublemax(doublea,doubleb,doublec,doubled)調(diào)用:max(1.1,2.3);max(1,4,3);max(1,100,34,45);成員方法的重載第43頁,共179頁,2024年2月25日,星期天構(gòu)造方法對象初始化系統(tǒng)在生成對象時,會為對象分配內(nèi)存空間,并自動調(diào)用構(gòu)造方法對實例變量進行初始化第44頁,共179頁,2024年2月25日,星期天構(gòu)造方法構(gòu)造方法一種和類同名的特殊方法用來初始化對象Java中的每個類都有構(gòu)造方法,用來初始化該類的一個新的對象沒有定義構(gòu)造方法的類,系統(tǒng)自動提供默認的構(gòu)造方法構(gòu)造方法的特點方法名與類名相同沒有返回類型,修飾符void也不能有(為什么不需要返回類型?)通常被聲明為公有的(public)可以有任意多個參數(shù)主要作用是完成對象的初始化工作不能在程序中顯式的調(diào)用在生成一個對象時,系統(tǒng)會自動調(diào)用該類的構(gòu)造方法為新生成的對象初始化第45頁,共179頁,2024年2月25日,星期天構(gòu)造方法系統(tǒng)提供的默認構(gòu)造方法如果在類的聲明中沒有聲明構(gòu)造方法,則Java編譯器會提供一個默認的構(gòu)造方法默認的構(gòu)造方法沒有參數(shù),其方法體為空使用默認的構(gòu)造方法初始化對象時,如果在類聲明中沒有給實例變量賦初值,則對象的屬性值為零或空聲明一個銀行帳號類及測試代碼publicclassBankAccount{ String

ownerName;int

accountNumber;float

balance;}publicclassBankTester{publicstaticvoidmain(Stringargs[]){ BankAccountmyAccount=newBankAccount(); System.out.println("ownerName="+myAccount.ownerName);System.out.println("accountNumber="+myAccount.accountNumber); System.out.println("balance="+myAccount.balance); }}運行結(jié)果ownerName=nullaccountNumber=0balance=0.0第46頁,共179頁,2024年2月25日,星期天構(gòu)造方法自定義構(gòu)造方法與方法重載可在生成對象時給構(gòu)造方法傳送初始值,使用希望的值給對象初始化構(gòu)造方法可以被重載,構(gòu)造方法的重載和普通方法的重載一致第47頁,共179頁,2024年2月25日,星期天構(gòu)造方法為BankAccount聲明一個有三個參數(shù)的構(gòu)造方法publicBankAccount(StringinitName,intinitAccountNumber,floatinitBalance){ownerName=initName;accountNumber=initAccountNumber;balance=initBalance;}假設(shè)一個新帳號的初始余額可以為0,則可增加一個帶有兩個參數(shù)的構(gòu)造方法publicBankAccount(StringinitName,intinitAccountNumber){ownerName=initName;accountNumber=initAccountNumber;balance=0.0f;}第48頁,共179頁,2024年2月25日,星期天構(gòu)造方法自定義無參的構(gòu)造方法無參的構(gòu)造方法對其子類的聲明很重要。如果在一個類中不存在無參的構(gòu)造方法,則要求其子類聲明時必須聲明構(gòu)造方法,否則在子類對象的初始化時會出錯在聲明構(gòu)造方法時,好的聲明習慣是不聲明構(gòu)造方法如果聲明,至少聲明一個無參構(gòu)造方法第49頁,共179頁,2024年2月25日,星期天構(gòu)造方法構(gòu)建一個Bush類,有兩個有參數(shù)的構(gòu)造方法classBush{ Bush(inti){……}Bush(doubled){……}}如果寫:newBush();

編譯器將要告訴你找不到對應(yīng)的構(gòu)造方法說明用戶在進行類聲明時,如果沒有聲明任何構(gòu)造方法,系統(tǒng)會賦給此類一個默認(無參)的構(gòu)造方法。但是,只要用戶聲明了構(gòu)造方法,即使沒有聲明無參的構(gòu)造方法,系統(tǒng)也不再賦默認的構(gòu)造方法第50頁,共179頁,2024年2月25日,星期天構(gòu)造方法在例子BankAccount基礎(chǔ)上再聲明一個無參的構(gòu)造方法publicBankAccount(){ownerName="";accountNumber=999999;balance=0.0f;}第51頁,共179頁,2024年2月25日,星期天綜合例子包括狀態(tài)、構(gòu)造方法、get方法及set方法publicclassBankAccount{ privateStringownerName; privateintaccountNumber; privatefloatbalance; publicBankAccount(){ ownerName=“”; accountNumber=0; balance=0; } publicBankAccount(StringinitName,intinitAccNum,floatinitBal){ ownerName=initName;accountNumber=initAccNum; balance=initBal; } publicStringgetOwnerName(){returnownerName;}publicintgetAccountNumber(){returnaccountNumber;}publicfloatgetBalance(){returnbalance;}publicvoidsetOwnerName(StringnewName){ownerName=newName;}publicvoidsetAccountNumber(intnewNum){accountNumber=newNum;}publicvoidsetBalance(floatnewBalance){balance=newBalance;}}第52頁,共179頁,2024年2月25日,星期天綜合例子聲明測試類AccountTesterpublicclassAccountTester{publicstaticvoidmain(Stringargs[]){

BankAccountanAccount;anAccount=newBankAccount("ZhangLi",100023,0);anAccount.setBalance(anAccount.getBalance()+100);System.out.println("Hereistheaccount:");System.out.println("Accountname:"+anAccount.getOwnerName());System.out.println("Accountnumber:"+anAccount.getAccountNumber());System.out.println("Balance:$"+anAccount.getBalance());}}測試結(jié)果Hereistheaccount:Accountname:ZhangLiAccountnumber:100023Balance:$100.0第53頁,共179頁,2024年2月25日,星期天內(nèi)存回收垃圾收集器自動掃描對象的動態(tài)內(nèi)存區(qū),對不再使用的對象做上標記以進行垃圾回收作為一個線程運行通常在系統(tǒng)空閑時異步地執(zhí)行當系統(tǒng)的內(nèi)存用盡或程序中調(diào)用System.gc()要求進行垃圾收集時,與系統(tǒng)同步運行finalize()方法在類java.lang.Object中聲明,因此Java中的每一個類都有該方法用于釋放系統(tǒng)資源,如關(guān)閉打開的文件或socket等聲明格式protectedvoidfinalize()throwsthrowable如果一個類需要釋放除內(nèi)存以外的資源,則需在類中重寫finalize()方法第54頁,共179頁,2024年2月25日,星期天內(nèi)存回收同C和C++的區(qū)別C語言中通過free來釋放內(nèi)存C++中則通過delete來釋放內(nèi)存在C和C++中,如果程序員忘記釋放內(nèi)存,則容易造成內(nèi)存泄漏甚至導致內(nèi)存耗盡在Java中不會發(fā)生內(nèi)存泄漏情況,但對于其它資源,則有產(chǎn)生泄漏的可能性第55頁,共179頁,2024年2月25日,星期天static(靜態(tài)變量/靜態(tài)方法)類的變量/方法,獨立于類的對象,可以直接根據(jù)類名調(diào)用也稱為類變量,類方法,聲明時需加static修飾符不管類的對象有多少,類變量只存在一份,在整個類中只有一個值,它不保存在任意一個對象的內(nèi)存空間中,而是保存在類的公共區(qū)域中類初始化的同時就被賦值適用情況類中所有對象都相同的屬性經(jīng)常需要共享的數(shù)據(jù)系統(tǒng)中用到的一些常量值引用格式<類名|實例名>.<類變量名>靜態(tài)成員第56頁,共179頁,2024年2月25日,星期天靜態(tài)成員對于一個圓類的所有對象,計算圓的面積時,都需用到π的值,可在Circle類的聲明中增加一個類屬性PIpublicclassCircle{

staticdoublePI=3.14159265;intradius;}當我們生成Circle類的實例時,在每一個實例中并沒有存儲PI的值,PI的值存儲在類中例如:系統(tǒng)類Math中的Math.E和Math.PI第57頁,共179頁,2024年2月25日,星期天靜態(tài)成員對類變量進行測試publicclassClassVariableTester{publicstaticvoidmain(Stringargs[]){Circlex=newCircle();System.out.println(x.PI);System.out.println(Circle.PI);Circle.PI=3.14;System.out.println(x.PI);System.out.println(Circle.PI);}}測試結(jié)果3.141592653.141592653.143.14第58頁,共179頁,2024年2月25日,星期天靜態(tài)成員聲明一個Point類,有兩個私有變量保存點坐標,一個類變量保存已有點的個數(shù)publicclassPoint{privateintx;privateinty;publicstaticintpointCount=0;publicPoint(intx,inty){this.x=x;this.y=y;pointCount++;}}第59頁,共179頁,2024年2月25日,星期天測試類ex2_4classex2_4{ publicstaticvoidmain(String[]args){ Pointp=newPoint(1,1);System.out.println(p.pointCount); Pointq=newPoint(2,2); System.out.println(q.pointCount); System.out.println(q.pointCount==Point.pointCount); System.out.println(Point.pointCount); }}測試結(jié)果12true2第60頁,共179頁,2024年2月25日,星期天靜態(tài)成員靜態(tài)方法也稱為類方法,表示類中對象的共有行為聲明時前面需加static修飾符類方法可以在不建立對象的情況下用類名直接調(diào)用,也可用類實例調(diào)用Math.sinMath.cosMath.maxMath.log

第61頁,共179頁,2024年2月25日,星期天靜態(tài)成員將攝氏溫度(centigrade)轉(zhuǎn)換成華氏溫度(fahrenheit)轉(zhuǎn)換公式為fahrenheit=centigrade*9/5+32除了攝氏溫度值及公式中需要的常量值,此功能不依賴于具體的類實例的屬性值,因此可聲明為類方法轉(zhuǎn)換方法centigradeToFahrenheit放在類Converter中publicclassConverter{publicstaticintcentigradeToFahrenheit(intcent){return(cent*9/5+32);}}方法調(diào)用Converter.centigradeToFahrenheit(40)第62頁,共179頁,2024年2月25日,星期天靜態(tài)成員main()方法統(tǒng)一格式:publicstaticvoidmain(String[]args)

在Java中,main()方法是Java應(yīng)用程序的入口方法,也就是說,程序在運行的時候,第一個執(zhí)行的方法就是main()方法因為main()方法是由Java虛擬機調(diào)用的,所以必須為public,虛擬機調(diào)用main()方法的時候不需要產(chǎn)生任何對象,所以main方法聲明為static,且不需要返回值,所以聲明為voidmain()方法可以有輸入?yún)?shù),類型為String[],這是java的規(guī)范,這個輸入?yún)?shù)數(shù)組的名字可以自己設(shè)定,但通常都取為agrs,用命令行執(zhí)行時:java主類名參數(shù)0參數(shù)1參數(shù)2……參數(shù)列表自動賦值給String[]args,以字符串存儲第63頁,共179頁,2024年2月25日,星期天靜態(tài)成員publicclassTestMain{

publicstaticvoidmain(Stringargs[]){ System.out.println("打印main方法中的輸入?yún)?shù)!"); for(inti=0;i<args.length;i++){ System.out.println(args[i]); } }}第64頁,共179頁,2024年2月25日,星期天final變量/方法final變量:定義一個常數(shù),即變量值不能改變finaldoublePI=3.1415927;final類:不能有子類final方法:方法不能被重寫(overriding)classChessAlgorithm{...

finalvoidnextMove(ChessPiecepieceMoved,BoardLocationnewLocation){...}...}final成員第65頁,共179頁,2024年2月25日,星期天方法參數(shù)成員方法參數(shù)傳遞publicstaticvoidmain(Stringargs[]){ intx=3,y=4; Testp=newTest(); System.out.println(x+""+y); p.swapInt(x,y); System.out.println(x+""+y);

intarr[]={5,6}; System.out.println(arr[0]+"

"

+arr[1]); p.swapArray(arr);

System.out.println(arr[0]+"

"

+arr[1]); }}classTest{ voidswapInt(intx1,inty1){ inttemp=x1;x1=y1;y1=temp; } voidswapArray(inta[]){

inttemp=a[0];a[0]=a[1];a[1]=temp; }第66頁,共179頁,2024年2月25日,星期天第三章面向?qū)ο筇卣骰靖拍铑惖亩x對象類的繼承和多態(tài)接口常用工具類第67頁,共179頁,2024年2月25日,星期天對象引用對象的變量格式:對象名.變量名引用對象的方法格式:對象名.方法名例1Vectorv=newVector();v.addElement("helloworld");例2inta[]={1,2,3,4,5};intsize=a.length;例3System.out.println();第68頁,共179頁,2024年2月25日,星期天對象通過對象引用對象的成員變量和成員方法classQangle{ inta,h; Qangle(){a=10;h=20;} Qangle(intx,inty){a=x;h=y;} Qangle(Qangler){ a=r.width(); h=r.height(); } voidset(intx,inty){a=x;h=y;}}q1.set(30,40);q1.a=30;q1.h=40;目的相同第一方式更安全、更面向?qū)ο?數(shù)據(jù)封裝)第69頁,共179頁,2024年2月25日,星期天對象的使用封裝封裝是一個面向?qū)ο蟮男g(shù)語,其含義很簡單,就是把東西包裝起來。換言之,成員變量和方法的定義都包裝于類定義之中,類定義可以看成是將構(gòu)成類的成員變量和方法封裝起來。通過限定類成員的可見性,可以使類成員中的某些屬性和方法能夠不被程序的其他部分訪問,它們被隱藏了起來,只能在定義的類中使用,這就是面向?qū)ο笾袑崿F(xiàn)封裝的方式。Java中封裝需要遵循的規(guī)則:(1)用訪問限制修飾符保護成員變量,通常是private。(2)建立公有的訪問方法,強制調(diào)用代碼通過這些方法訪問成員變量。第70頁,共179頁,2024年2月25日,星期天對象的使用publicclassDesk{ privateintheight; privateintwidth; publicvoidsetProperty(inti,intj){ if(i>0){ height=i; System.out.println("設(shè)置桌子高成功"); }elseSystem.out.println("設(shè)置桌子高出錯"); if(j>0){ width=j; System.out.println("設(shè)置桌子寬成功"); }elseSystem.out.println("設(shè)置桌子寬出錯"); }}第71頁,共179頁,2024年2月25日,星期天對象的使用publicclassTest{ publicstaticvoidmain(String[]args){ //創(chuàng)建desk對象

Deskd=newDesk(); //訪問成員變量height和width

d.setProperty(-100,200); }}第72頁,共179頁,2024年2月25日,星期天對象的使用封裝不但可以提高健壯性,還便于代碼維護例如:把上例中的width類型改為StringpublicclassDesk{ privateintheight; //將width改為String型

privateStringwidth; publicvoidsetProperty(inti,intj){ if(i>0){ height=i; //Integer.toString(i)將int類型轉(zhuǎn)為String類型

System.out.println("設(shè)置桌子高成功,高為"+Integer.toString(i)); }else System.out.println("設(shè)置桌子高出錯"); if(j>0){ //將輸入的int類型轉(zhuǎn)為String類型

Stringwidth_s=Integer.toString(j); width=width_s; System.out.println("設(shè)置桌子寬成功,寬為"+width); }else System.out.println("設(shè)置桌子寬出錯"); }}第73頁,共179頁,2024年2月25日,星期天對象的使用publicclassTest{ publicstaticvoidmain(String[]args){ //創(chuàng)建desk對象

Deskd=newDesk(); //訪問成員變量height和width d.setProperty(120,230); }}第74頁,共179頁,2024年2月25日,星期天對象的使用對象作為方法的參數(shù)[訪問權(quán)限修飾符]方法返回類型方法名(參數(shù)){

方法體;}參數(shù):類型變量名,…

…類型:基本數(shù)據(jù)類型/復(fù)合類型(對象)參數(shù)的傳遞基本數(shù)據(jù)類型:值傳遞(Passbyvalue)復(fù)合數(shù)據(jù)類型:引用傳遞第75頁,共179頁,2024年2月25日,星期天例對象用作方法的參數(shù)對象的使用classTest{publicstaticvoidmain(Stringargs[]){ Spots=newSpot(2,3); System.out.println("s點的坐標:"+ +s.getX()+","+s.getY()); Transts=newTrans();

ts.move(s,4,5); System.out.println("s點的坐標:"+ +s.getX()+","+s.getY()); }}classSpot{ privateintx,y; Spot(intu,intv){ x=u;y=v;} voidsetX(intx1){x=x1;} voidsetY(inty1){y=y1;} intgetX(){returnx;} intgetY(){returny;}}classTrans{

voidmove(Spotp,inth,intk){ p.setX(p.getX()+h); p.setY(p.getY()+k); }}classTest{publicstaticvoidmain(Stringargs[]){ Spots=newSpot(2,3); System.out.println("s點的坐標:" +s.getX()+","+s.getY());

Trans.move(s,4,5); System.out.println("s點的坐標:" +s.getX()+","+s.getY()); }}classSpot{ privateintx,y; Spot(intu,intv){ x=u;y=v;} voidsetX(intx1){x=x1;} voidsetY(inty1){y=y1;} intgetX(){returnx;} intgetY(){returny;}}classTrans{staticvoidmove(Spotp,inth,intk){ p.setX(p.getX()+h); p.setY(p.getY()+k); }}classTest{publicstaticvoidmain(Stringargs[]){ Spots=newSpot(2,3); System.out.println("s點的坐標:" +s.getX()+","+s.getY());

s.move(4,5); System.out.println("s點的坐標:" +s.getX()+","+s.getY()); }}classSpot{ privateintx,y; Spot(intu,intv){ x=u;y=v;} voidsetX(intx1){x=x1;} voidsetY(inty1){y=y1;} intgetX(){returnx;} intgetY(){returny;}

voidmove(inth,intk){ x=x+h; y=y+k; }}第76頁,共179頁,2024年2月25日,星期天對象的使用對象的訪問對象作為方法的返回值[訪問權(quán)限修飾符]方法返回類型方法名(參數(shù)){

方法體;}返回類型有返回值:基本數(shù)據(jù)類型/復(fù)合類型(對象)無返回值:void第77頁,共179頁,2024年2月25日,星期天對象的使用對象作為方法的返回值例:求兩點坐標之間的中點坐標思路:(x1,y1)和(x2,y2)(x,y)x=(x1+x2)/2,y=(y1+y2)/2Spots1=newSpot(2,3);Spots2=newSpot(4,5);Spots=s1.midSpot(s2);第78頁,共179頁,2024年2月25日,星期天例對象用作方法的返回值對象的使用classTest{publicstaticvoidmain(Stringargs[]){ Spots1=newSpot(3.0,5.0); Spots2=newSpot(6.0,8.0); System.out.println("s1點的坐標:" +s1.getX()+","+s1.getY()); System.out.println("s2點的坐標:" +s2.getX()+","+s2.getY());

Spots=s1.midSpot(s2); System.out.println("中點的坐標:" +s.getX()+","+s.getY()); }}classSpot{ privatedoublex,y; Spot(doubleu,doublev){ setX(u);setY(v);} voidsetX(doublex1){x=x1;} voidsetY(doubley1){y=y1;} doublegetX(){returnx;} doublegetY(){returny;}

SpotmidSpot(Spots){ doublemidX=(x+s.getX())/2; doublemidY=(y+s.getY())/2;

returnnewSpot(midX,midY); }}第79頁,共179頁,2024年2月25日,星期天對象的使用對象數(shù)組classTest{ publicstaticvoidmain(Stringargs[]){ inta[]=newint[5]; for(inti=0;i<a.length;i++) System.out.println(a[i]); Strings[]={"a","bc","def","ghij"}; for(inti=0;i<s.length;i++) System.out.println(s[i]); for(inti=0;i<s.length;i++) System.out.println(s[i].length()); }}第80頁,共179頁,2024年2月25日,星期天對象的使用對象數(shù)組classStudent{ privateStringname; privateStringid; Student(Strings1,Strings2){name=s1;id=s2;} StringgetName(){returnname;} voidsetName(Strings){name=s;} voiddisplay(){ System.out.println(name+ ""+id);}}Studentst[]=newStudent[10];for(inti=0;i<st.length;i++){ st[i]=newStudent(…);}for(inti=0;i<st.length;i++){ st[i].display();}第81頁,共179頁,2024年2月25日,星期天對象的使用對象作為另一個對象的成員變量一個對象中包含另一個對象,組合關(guān)系classStudent{ privateStringname; privateStringid; Student(Strings1,Strings2){ name=s1;id=s2; } StringgetName(){retu

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論