Java程序設(shè)計(jì)修改_第1頁
Java程序設(shè)計(jì)修改_第2頁
Java程序設(shè)計(jì)修改_第3頁
Java程序設(shè)計(jì)修改_第4頁
Java程序設(shè)計(jì)修改_第5頁
已閱讀5頁,還剩17頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、第3章 類和對(duì)象Java通過類和對(duì)象來組織和構(gòu)建程序。類包括類的聲明和類的主體。類的主體包括成員變量和成員方法。類的主體中還包括一個(gè)與類名相同無返回值的特殊方法,這就是構(gòu)造函數(shù)。構(gòu)造函數(shù)用來對(duì)對(duì)象進(jìn)行初始化。有些方法在使用時(shí)需要為其傳送參數(shù),this引用可以把當(dāng)前對(duì)象作為參數(shù)傳遞到方法中。類設(shè)計(jì)好以后,就可以用來定義對(duì)象,對(duì)象是一種引用類型,存放的是實(shí)際對(duì)象的內(nèi)存地址。使用對(duì)象名來訪問對(duì)象的成員變量和方法,以實(shí)現(xiàn)對(duì)對(duì)象的操作,完成程序的功能。包是類的組織結(jié)構(gòu)。包主要用來管理Java中的類并提供訪問控制。本章要點(diǎn)l 類的定義與對(duì)象的創(chuàng)建l 構(gòu)造方法的使用l this引用l 包的訪問本章難點(diǎn)l 類

2、的定義l 構(gòu)造方法的使用學(xué)習(xí)目標(biāo)l 掌握類的定義與創(chuàng)建l 掌握構(gòu)造方法的使用l 了解包的訪問3.1 類的定義311類和對(duì)象的關(guān)系類(Class)是一種復(fù)雜的數(shù)據(jù)類型,它是將數(shù)據(jù)和與數(shù)據(jù)相關(guān)的操作封裝在一起的集合體。類是普通數(shù)據(jù)類型的擴(kuò)展,它不但包含數(shù)據(jù),還包含了對(duì)數(shù)據(jù)進(jìn)行操作的方法(method)。方法反映的是數(shù)據(jù)的行為而不是數(shù)據(jù)本身。對(duì)象 (Object)是類的實(shí)例,當(dāng)程序運(yùn)行時(shí),對(duì)象占用內(nèi)存單元。對(duì)象與類的關(guān)系就像變量與類型的關(guān)系一樣。例如:如果把“人”看成是一個(gè)抽象的類,我們每一個(gè)具體的人,就是“人”類中的一個(gè)實(shí)例,即一個(gè)對(duì)象,每個(gè)人的的姓名、年齡、身高、體重等特征可作為“人”類中的數(shù)據(jù)

3、,吃飯、走路、工作等行為作為類的方法。Java 中的所有數(shù)據(jù)類型都是用類來實(shí)現(xiàn)的,Java語言是建立在類這個(gè)邏輯結(jié)構(gòu)之上的,類是Java的核心。312 類的定義格式1類的聲明格式Java類的定義格式分為兩部分:類聲明和類主體。其格式如下: 類聲明中包括關(guān)鍵字class,類名及類的屬性。類聲明的格式如下:classextendsimplements類主體是Java類的主體部分,完成變量的說明以及方法的定義及實(shí)現(xiàn)。在類中,用變量來說明類的狀態(tài),而用方法來實(shí)現(xiàn)類的行為。包含類主體的類結(jié)構(gòu)如下: 2聲明成員變量Java類的狀態(tài)用成員變量來表示。聲明成員變量必須給出變量名及其所屬的類型,同時(shí)還可以指定其

4、他特性。聲明格式如下:3聲明成員方法類的行為由它的方法實(shí)現(xiàn),其他對(duì)象可以調(diào)用對(duì)象的方法來得到該對(duì)象的服務(wù)。方法的聲明與實(shí)現(xiàn)也可分為兩部分:方法聲明和方法體。聲明成員方法的格式如下:(參數(shù)列表)throws 方法都有一個(gè)返回類型,如果一個(gè)方法不返回任何值,則它必須有一個(gè)void的返回類型聲明。如果一個(gè)方法具有返回值,則在方法體中使用return語句把一個(gè)確定的值返回給調(diào)用該方法的語句。return語句的一般格式如下:return ;參數(shù)表由類型聲明和參數(shù)名組成,參數(shù)名之間由逗號(hào)分開,若方法無參數(shù),則參數(shù)表為空。方法的主體稱為方法體,它是成員方法的實(shí)現(xiàn)部分。方法體包含在一對(duì)大括號(hào)中,即使方法體沒有

5、語句,一對(duì)大括號(hào)也是必不可少的。在方法體中也可以聲明變量,但方法體中聲明的變量只是屬于方法的局部變量,而不是類的成員變量?!纠?_1】類定義示例。class Exam3_1int i=10;public void printI()System.out.println (i=+i);程序中我們定義了一個(gè)類,名字叫做Exam3_1,在這個(gè)類中我們定義了一個(gè)成員變量i,一個(gè)成員方法printI(),這就完成了一個(gè)最基本的類的定義。3.2 方法方法是類的成員,它與類的成員變量一起被封裝在類中,并在類中實(shí)現(xiàn)。方法的聲明格式已經(jīng)在3.1節(jié)中給出了。在使用方法時(shí)我們會(huì)遇到有返回值的方法和無返回值的方法,以及

6、有參數(shù)的方法和無參數(shù)的方法。321 方法的返回值方法的返回值類型可以是基本數(shù)據(jù)類型也可以是對(duì)象,如果沒有返回值,就用void來描述。例如,main方法就沒有返回值,而且必須沒有返回值。如果一個(gè)方法有返回值,則可以在方法體中使用return 語句將值返回,需要注意的是方法的返回值的類型必須和return 語句中返回的值的類型一樣?!纠?_2】方法的返回值。class Exam3_2static int i=10;public static void print1()System.out.println (i=+i);public static int print2()return i;publi

7、c static void main(String args) print1(); System.out.println (i=+print2(); 程序中我們創(chuàng)建了兩個(gè)方法print1()和print2(),print1()方法是無返回值的,因此在聲明時(shí)使用void表明其無返回值,print2()方法會(huì)返回一個(gè)int類型的變量i,因此在方法聲明是使用int表明返回值類型是int型,并使用return語句返回了int類型的變量i。程序的運(yùn)行結(jié)果如圖3-1所示。圖3-1 例3_2程序運(yùn)行結(jié)果322 方法的參數(shù)從參數(shù)上考察方法的話,方法分為有參方法和無參方法,需要注意的是,在Java語言中,向方法

8、傳遞參數(shù)的方式是“按值傳遞”。按值傳遞意味著當(dāng)將一個(gè)參數(shù)傳遞給一個(gè)方法時(shí),首先創(chuàng)建了源參數(shù)的一個(gè)副本并將這個(gè)副本傳入了方法,這樣方法接收的是原始值的一個(gè)副本。因此,即使在方法中修改了該參數(shù),那僅僅是改變副本,而源參數(shù)值保持不變。【例3_3】方法的參數(shù)。class Exam3_3static int i=10;public static void set1()i=100;public static void set2(int n)i=n;public static void print()System.out.println (i=+i);public static void main(Stri

9、ng args)print(); set1(); print(); set2(50); print(); 對(duì)程序3.1做修改,添加了兩個(gè)方法set1()和set()2,其中set1()是沒有參數(shù)的方法,方法中將i的值修改為100,而set2()方法是帶有一個(gè)整形參數(shù)的方法,將傳進(jìn)來的參數(shù)值賦值給i,這樣在main()方法中調(diào)用set2()時(shí),會(huì)將傳入的整數(shù)值50傳遞給i。程序的運(yùn)行結(jié)果如圖3-2所示。圖3-2 例3_3程序運(yùn)行結(jié)果【例3_4】方法的參數(shù)傳遞。class Exam3_4public static void changeI(int i)i=100;System.out.printl

10、n (changeI方法中i=+i);public static void main(String args) int i=10; System.out.println (轉(zhuǎn)換前i=+i); changeI(i); System.out.println (轉(zhuǎn)換后i=+i); 不難看出,雖然在changeI()方法中改變了傳進(jìn)來的參數(shù)i的值,但對(duì)這個(gè)參數(shù)的源變量本身并沒有影響,即對(duì) main方法里的 i 變量沒有影響。這說明,按值傳遞實(shí)際上是將參數(shù)的值作了一個(gè)副本傳進(jìn)方法的,因此,無論在方法里怎么改變其值,結(jié)果都只是改變了拷貝的值,而不是源值。運(yùn)行結(jié)果如圖3-3所示。圖3-3 例3_4程序運(yùn)行結(jié)

11、果3.3 類的實(shí)例化331 創(chuàng)建對(duì)象創(chuàng)建對(duì)象包括對(duì)象聲明和對(duì)象初始化兩個(gè)部分。通常這兩部分是結(jié)合在一起的,即定義對(duì)象的同時(shí)對(duì)其初始化,為其分配空間,并進(jìn)行賦值。其格式為: = new ( )例如,創(chuàng)建例3.1中Exam3_1類的一個(gè)對(duì)象可以寫成:Exam3_1 e=new Exam3_1();其中e是所創(chuàng)建的對(duì)象的名字。Java中的對(duì)象是引用類型。引用類型是指該類型的標(biāo)識(shí)符表示的是一片連續(xù)內(nèi)存地址的首地址。對(duì)象定義后系統(tǒng)將給對(duì)象標(biāo)識(shí)符分配一個(gè)內(nèi)存單元,用以存放實(shí)際對(duì)象在內(nèi)存中的存放位置。在沒有用new關(guān)鍵字創(chuàng)建實(shí)際對(duì)象前,對(duì)象名的值為null。332使用對(duì)象成員一旦定義并創(chuàng)建了對(duì)象,就可以在程

12、序中使用對(duì)象了。對(duì)象通過使用成員運(yùn)算符“”實(shí)現(xiàn)對(duì)變量的訪問和方法的調(diào)用。通常使用的格式為:對(duì)象名成員變量名對(duì)象名成員方法名( )【例3_5】類定義示例。class Exam3_5static int i=10;public static void printI()System.out.println (i=+i); public static void main(String args) Exam3_5 e=new Exam3_5(); e.printI(); e.i=100; e.printI(); 程序中我們?cè)趍ain()方法中創(chuàng)建了類的對(duì)象e,并使用e訪問了其中的變量i和方法e.prin

13、tI(),運(yùn)行結(jié)果如圖3-2所示。圖3-4 例3_5程序運(yùn)行結(jié)果333對(duì)象資源的回收每個(gè)對(duì)象都要求資源才能“生存”,其中最令人注目的資源是內(nèi)存。如果不再需要使用一個(gè)對(duì)象,就必須將其清除,以便釋放這些資源,給其他對(duì)象使用。我們創(chuàng)建對(duì)象,在需要的時(shí)候調(diào)用它,然后將其清除或者“破壞”。但是如何才能知道什么時(shí)間刪除對(duì)象呢?Java編程語言解除了程序員回收內(nèi)存資源的責(zé)任,它提供垃圾回收機(jī)制(Garbage Collection)以跟蹤每一存儲(chǔ)器的分配情況并對(duì)不再使用的內(nèi)存資源作回收。在垃圾回收機(jī)制中,JVM會(huì)跟蹤資源的使用情況,定期檢測(cè)出不使用的內(nèi)存,由系統(tǒng)自動(dòng)回收并做再次分配。垃圾收集器“知道”一個(gè)對(duì)

14、象在什么時(shí)候不再使用,然后會(huì)自動(dòng)釋放那個(gè)對(duì)象占據(jù)的內(nèi)存空間。因此,Java程序中將不用考慮對(duì)象的釋放問題,從而減輕程序員的負(fù)擔(dān),提高程序安全性,避免因資源耗盡而導(dǎo)致系統(tǒng)癱瘓的隱患。334類成員的訪問控制在說明類的定義時(shí)我們提到了類及其成員的修飾符,可以用來修飾類的修飾符有public、abstract、final,用來修飾類的成員變量的有public、private、protected、final、static,修飾成員方法的有public、private、protected、final、static、abstract。任何修飾符都沒有使用的,屬于默認(rèn)修飾符(friendly)。將這些修飾符的

15、作用列如表3-1所示。表3-1 類及其成員修飾符的作用訪問控制修飾符同一類中同一包中不同包中的子類不同包中的非子類publicYesYesYesYesprotectedYesYesYesNo(friendly)YesYesNoNoprivateYesNoNoNo類型說明final最終類或最終成員,修飾類時(shí)表示此類不能有子類,修飾變量時(shí)表明此變量是一個(gè)常量,修飾方法時(shí)表明此方法不允許被覆蓋abstract抽象類或抽象方法,修飾類時(shí)表明此類不能定義對(duì)象,修飾方法時(shí)表明此方法必須被覆蓋static類成員或靜態(tài)成員,表明此成員屬于類,而不屬于該類的某一具體對(duì)象1訪問控制修飾符訪問控制修飾符說明類或類的

16、成員的可訪問范圍,用public修飾的類或成員擁有公共作用域,表明此類或類的成員可以被任何Java中的類所訪問,是最廣泛的作用范圍。用protected修飾的變量或方法擁有受保護(hù)作用域,可以被同一個(gè)包中所有的類及其他包中該類的子類所訪問。用private修飾的變量或方法擁有私有作用域,只能在此類中訪問,在其他類中,包括該類的子類中也是不允許訪問的,private是最保守的作用范圍。沒有使用任何修飾符的,擁有默認(rèn)訪問權(quán)限,表明此類或類的成員可以被同一個(gè)包中的其它類訪問?!纠?_6】訪問控制修飾符示例。class Exam3_6private static int i=10;public stat

17、ic void printI()System.out.println (i=+i);public void setI(int i1)i=i1;class Testpublic static void main(String args) Exam3_6 e=new Exam3_6(); e.printI(); /e.i=100; e.setI(100); e.printI(); 程序中我們將i的修飾符改為private,這樣i只能在類Exam3_4中直接訪問,在Test類中的直接訪問語句e.i=100將出現(xiàn)“i has private access in Exam3_4”錯(cuò)誤,為了給i賦值,我們

18、提供了可以在所有類中訪問的public方法setI(),以達(dá)到改變i值得目的。程序運(yùn)行結(jié)果如圖3-5所示。圖3-5 例3_6程序運(yùn)行結(jié)果2static修飾符在一個(gè)類中,使用static修飾的變量和方法分別稱為類變量(或稱靜態(tài)變量)和類方法(或稱靜態(tài)方法),沒有使用static修飾的變量和方法分別稱為實(shí)例變量和實(shí)例方法。類成員(靜態(tài)成員)屬于這個(gè)類而不是屬于這個(gè)類的某個(gè)對(duì)象,它由這個(gè)類所創(chuàng)建的所有對(duì)象共同擁有。類成員僅在類的存儲(chǔ)單元中存在,而在由這個(gè)類所創(chuàng)建的所有對(duì)象中,只是存儲(chǔ)了一個(gè)指向該成員的引用。因此,如果任何一個(gè)該類的對(duì)象改變了類成員,則對(duì)其他對(duì)象而言該類成員會(huì)發(fā)生同樣的改變。對(duì)于類成員

19、,既可以使用對(duì)象進(jìn)行訪問,也可以使用類名直接進(jìn)行訪問,并且在類方法中只能訪問類成員,而不能訪問實(shí)例成員。實(shí)例成員由每一個(gè)對(duì)象個(gè)體獨(dú)有,對(duì)象的存儲(chǔ)空間中的確有一塊空間用來存儲(chǔ)該成員。不同的對(duì)象之間,它們的實(shí)例成員相互獨(dú)立,任何一個(gè)對(duì)象改變了自己的實(shí)例成員,只會(huì)影響這個(gè)對(duì)象本身,而不會(huì)影響其他對(duì)象中的實(shí)例成員。對(duì)于實(shí)例成員,只能通過對(duì)象來訪問,不能通過類名進(jìn)行訪問。在實(shí)例方法中,既可以訪問實(shí)例成員,也可以訪問類成員。【例3_7】static修飾符訪問示例。class Exam3_7static int i=1;int j=1;static void printStatic( )System.out

20、.println(i=+i);/System.out.println(j=+j);/非法訪問void print()System.out.println(i=+i);System.out.println(j=+j);public static void main(String args)Exam3_7.printStatic( );/Exam3_7.print( );/非法訪問Exam3_7.i=2;/Exam3_7.j=2;/非法訪問Exam3_7 st=new Exam3_7( );st.i=3;st.j=3;st.print( );st.printStatic( );Exam3_7.pr

21、intStatic( );程序定義了一個(gè)類變量i,定義了一個(gè)實(shí)例變量j,定義了一個(gè)類方法printStatic(),定義了一個(gè)實(shí)例方法print(),在類方法printStatic()中,只能訪問類變量i,但不能訪問實(shí)例變量j,在實(shí)例方法print()中,則兩個(gè)變量都可以訪問。在main()方法中,由于main()方法是使用static修飾的,因此可以直接通過類名訪問類變量i和類方法printStatic(),但不能通過類名訪問實(shí)例變量j和實(shí)例方法print(),而一旦定義了對(duì)象st,則通過對(duì)象st可以訪問類的任何成員,不論是類成員還是實(shí)例成員。程序運(yùn)行結(jié)果如圖3-6所示。圖3-6 例3_7程

22、序運(yùn)行結(jié)果【例3_8】測(cè)試類變量與實(shí)例變量的不同。class Exam3_8int i=0;static int j=0;public void print( )System.out.println(i=+i);System.out.println(j=+j);public static void main(String args)Exam3_8 sv1=new Exam3_8( );sv1.i+;sv1.j+;sv1.print();Exam3_8 sv2=new Exam3_8( );sv2.print();程序中定義了實(shí)例變量i和類變量j,創(chuàng)建了兩個(gè)對(duì)象sv1和sv2,對(duì)sv1中的i和j

23、進(jìn)行自增運(yùn)算,輸出均為1;然后輸出sv2中的兩個(gè)變量,結(jié)果為0和1。因?yàn)閕是實(shí)例變量,sv1的更改只影響sv1本身,不影響其他對(duì)象,而j是類變量,sv1對(duì)其更改,sv2中的該變量會(huì)隨之更改。程序運(yùn)行結(jié)果如圖3-7所示。圖3-7 例3_8程序運(yùn)行結(jié)果3.4 構(gòu)造函數(shù)341 構(gòu)造函數(shù)的作用和定義構(gòu)造函數(shù)也稱為構(gòu)造方法,用來對(duì)對(duì)象進(jìn)行初始化。它本身是一種特殊的方法,構(gòu)造函數(shù)的名字必須和類名完全相同,并且沒有返回值,甚至連表示無返回值的空類型(void)也沒有,當(dāng)創(chuàng)建對(duì)象時(shí),由new運(yùn)算符自動(dòng)調(diào)用。有了構(gòu)造函數(shù),我們?cè)?.2節(jié)中對(duì)類的實(shí)例化的格式可以改成: = new ( )由此可以看到,構(gòu)造函數(shù)的作

24、用就是用于創(chuàng)建不同的對(duì)象?!纠?_9】構(gòu)造函數(shù)使用示例。class Exam3_9 int i; public Exam3_9(int i1) i=i1; public void printI()System.out.println (i=+i);class Testpublic static void main(String args) Exam3_9 e1=new Exam3_9(1); Exam3_9 e2=new Exam3_9(2); Exam3_9 e3=new Exam3_9(3); e1.printI(); e2.printI(); e3.printI(); 程序中的publi

25、c Exam3_9(int i1)是一個(gè)方法的聲明,但是該方法無返回值,且與類名完全相同,因此它是類Exam3_9的構(gòu)造函數(shù)。在這個(gè)構(gòu)造函數(shù)中,我們將傳遞進(jìn)來的整數(shù)值賦值給類的成員變量i,因此,我們可以用構(gòu)造函數(shù)來創(chuàng)建具有不同i的 Exam3_9類的對(duì)象e1、e2、e3。程序的執(zhí)行結(jié)果如圖3-8所示。圖3-8 例3_9程序運(yùn)行結(jié)果342 默認(rèn)構(gòu)造函數(shù)一般而言,每個(gè)類都至少有一個(gè)構(gòu)造函數(shù)。如果程序員沒有為類定義構(gòu)造函數(shù),Java虛擬機(jī)會(huì)自動(dòng)為該類生成一個(gè)默認(rèn)的構(gòu)造函數(shù)。默認(rèn)構(gòu)造函數(shù)的參數(shù)列表及方法體都為空。在程序中,當(dāng)使用new Xxx()的形式來創(chuàng)建對(duì)象實(shí)例時(shí),就是調(diào)用了默認(rèn)構(gòu)造函數(shù),這里Xx

26、x表示類名。例如在3.1和3.2節(jié)中我們遇到的所有的構(gòu)造函數(shù)其實(shí)都是由JVM為我們創(chuàng)建的默認(rèn)構(gòu)造函數(shù)。要特別注意的是,如果程序員定義了一個(gè)或多個(gè)構(gòu)造函數(shù),則自動(dòng)屏蔽掉默認(rèn)的構(gòu)造函數(shù)。3.5 this引用351 this引用在例3_9的構(gòu)造函數(shù)中我們將傳入的變量i1的值賦值給類的成員變量i,如果我們不把構(gòu)造函數(shù)的參數(shù)聲明為i1,而把它也聲明為i,此時(shí)構(gòu)造函數(shù)中的賦值語句就會(huì)變?yōu)閕=i;這樣我們就分不清楚兩個(gè)“i”究竟指的是哪一個(gè)。此時(shí)我們需要一個(gè)指示器來指明究竟哪一個(gè)“i”是構(gòu)造方法中的變量i,哪一個(gè)“i”是類中的成員變量i,而這個(gè)指示器就是this引用。在Java語言動(dòng)態(tài)方法的作用域中,thi

27、s代表當(dāng)前的對(duì)象,一個(gè)變量引用它自己的實(shí)例變量及方法時(shí),在每個(gè)引用的前面都隱含著this?!纠?_10】this引用使用示例1。class Exam3_10 int i; public Exam3_10(int i) this.i=i; public void printI()System.out.println (i=+i);class Testpublic static void main(String args) Exam3_10 e1=new Exam3_10(1); e1.printI(); 程序中的構(gòu)造函數(shù)Exam3_10(int i)的參數(shù)與類的成員變量同名,因此我們使用this

28、引用當(dāng)前對(duì)象,這樣在這個(gè)構(gòu)造函數(shù)中的this.i指的就是類的成員變量i,而沒有使用this應(yīng)用的變量i,指的就是構(gòu)造函數(shù)的參數(shù)i。程序的執(zhí)行結(jié)果如圖3-9所示。圖3-9 例3_10程序運(yùn)行結(jié)果有些時(shí)候,方法需要明確使用對(duì)當(dāng)前對(duì)象的引用,此時(shí)要使用this關(guān)鍵字。this關(guān)鍵字用于獲得調(diào)用本方法的那個(gè)對(duì)象的引用。當(dāng)方法需要訪問類的成員變量時(shí),就可以使用this引用指明要操作的對(duì)象。【例3_11】this引用使用示例2。class Exam3_11 int i; public Exam3_11(int i) this.i=i;printI(this); public void printI(Exa

29、m3_11 e)System.out.println (i=+e.i);class Testpublic static void main(String args) Exam3_11 e1=new Exam3_11(1); 類Exam3_11的構(gòu)造方法中調(diào)用了方法printI(),但printI()需要Exam3_11類的一個(gè)對(duì)象作參數(shù),也就是使用本身這個(gè)類的一個(gè)對(duì)象作參數(shù),此時(shí)我們使用this引用當(dāng)前這個(gè)類的對(duì)象。程序的運(yùn)行結(jié)果如圖3-8所示。352 類的封裝性我們知道,類由成員變量和成員方法構(gòu)成,變量和方法可以封裝在一個(gè)單個(gè)實(shí)體中,這是面向?qū)ο笳Z言的一個(gè)基本特征封裝。我們對(duì)類可以進(jìn)行各種操

30、作,也就是對(duì)類的成員進(jìn)行各種操作。但是如果可以訪問的類的成員很多,出現(xiàn)問題的機(jī)率就會(huì)變大,程序的健壯性、穩(wěn)定性就變得很差。為避免這種情況,在面向?qū)ο缶幊讨刑岢隽恕皬?qiáng)內(nèi)聚、弱耦合”的編程思想。也就是要求一個(gè)類的內(nèi)部成員之間聯(lián)系緊密一些,而一個(gè)類與其他類之間的聯(lián)系疏松一些。實(shí)現(xiàn)這種“強(qiáng)內(nèi)聚、弱耦合”編程思想的方式,就是盡可能的把類的成員聲明為私有的(private),只把一些少量的、必要的方法聲明為公共的(public),提供給外部使用。這種方式使得類功能的實(shí)現(xiàn)只在類內(nèi)可見,在類的外部,則只能訪問那些少量的public方法,完成相應(yīng)的功能。至于實(shí)現(xiàn)這些功能的內(nèi)部機(jī)理和過程,在類的外部并不知道也不需

31、要知道,從而減少了用戶對(duì)類的內(nèi)部成員的訪問,增強(qiáng)了程序的健壯性。這種技術(shù)就是封裝。它將類的外部界面與類的實(shí)現(xiàn)區(qū)分開來,隱藏實(shí)現(xiàn)細(xì)節(jié)。迫使用戶去使用外部界面,即使實(shí)現(xiàn)細(xì)節(jié)改變,還可通過界面承擔(dān)其功能而保留原樣,確保調(diào)用它的代碼還繼續(xù)工作。這使代碼維護(hù)更簡(jiǎn)單。3.6類的組織361 包的概念包是Java提供的文件組織方式。一個(gè)包對(duì)應(yīng)一個(gè)文件夾,一個(gè)包中可以包括很多類文件,包中還可以有子包,形成包等級(jí)。Java把類文件放在不同等級(jí)的包中。這樣一個(gè)類文件就會(huì)有兩個(gè)名字:一個(gè)是類文件的非全限定名,另外一個(gè)是類文件的全限定名。非全限定名就是類文件本身的名字,全限定名則是在類文件的名字前面加上包的名字。362

32、 創(chuàng)建包 創(chuàng)建一個(gè)包是很簡(jiǎn)單的:只要使用一個(gè)package語句作為一個(gè)Java源文件的第一句,則該源文件中所定義的任何類都將屬于由此package語句指定的包。其語法格式為:package ;其中package是關(guān)鍵字,包名是包的標(biāo)識(shí)符。package語句使得其所在文件中的所有的類都屬于指定的包。例如:package myPackage; 也可以創(chuàng)建包的層次。一個(gè)多級(jí)包的聲明的通用形式如下:package . .;例如,下面的聲明在名為MyPackage的包中創(chuàng)建了它的子包secondPackage。package myPackage .secondPackage;需要注意的是,在一個(gè)Java

33、文件中,只允許出現(xiàn)一句package語句?!纠?_12】創(chuàng)建包的示例。package pa;class Exam3_12 int i; public Exam3_12(int i) this.i=i;printI(this); public void printI(Exam3_12e)System.out.println (i=+e.i);class Testpublic static void main(String args) Exam3_12 e1=new Exam3_12(1); 我們?cè)诔绦虻淖钋懊婕由狭藀ackage pa一條語句,此時(shí)類Exam3_12和Test就屬于包pa。在執(zhí)行

34、javac生成語句時(shí),加 d參數(shù),可在指定目錄下建立一個(gè)以包名命名的文件夾,生成好的class文件會(huì)存入該目錄中。如上題在生成時(shí)可寫為:javac d E:myjava Exam3_12.java此時(shí)會(huì)在E:myjava目錄下創(chuàng)建一個(gè)pa文件夾,生成的class文件存于該文件夾中。若在生成時(shí)不使用 d 參數(shù)直接創(chuàng)建新文件夾,也可以先手工建立包文件夾,然后將生成的類存入包文件夾中。但我們一般不推薦使用這種方法。363 訪問包包的存在方便了類的管理,但在使用一個(gè)類時(shí)必須加上類所在包的包名,這會(huì)帶來編程的不便。為此,Java使用import語句來引入特定的類甚至是整個(gè)包。一旦被引入,類可以被直呼其名

35、,而不必使用全限定名。在Java源程序文件中,import語句緊接著package語句(如果package 語句存在的話),它存在于任何類定義之前。下面是import聲明的通用形式:import pkg1.pkg2.(classname|*);這里,pkg1是頂層包名,pkg2是在外部包中的用逗點(diǎn)(.)隔離的下級(jí)包名。引入包還有另外一種情況,那就是使用一個(gè)星號(hào)(*)指明要引入這個(gè)包中所有的public類。例如:import java.util.Date;/引入java.util.Date類import java.io.*;/引入java.io包中的所有public類【例3_13】訪問包的示例。

36、package pa;import java.lang.Math;class Exam3_13 int i; public Exam3_13(int i) this.i=i;printI(this); public void printI(Exam3_13 e)System.out.println (i=+e.i);class Testpublic static void main(String args)int i=(int)(Math.random()*100); Exam3_13 e1=new Exam3_13(i); 程序中我們使用了import java.lang.Math語句引入了

37、Math類,在程序中就可以使用這個(gè)類了。我們?cè)趍ain()方法中使用了Math類的random()方法產(chǎn)生了一個(gè)01的隨機(jī)數(shù),然后將其轉(zhuǎn)化成一個(gè)0100的整數(shù),將其作為Exam3_13類的構(gòu)造函數(shù)的參數(shù),來初始化創(chuàng)建的對(duì)象。3.7案例一個(gè)銀行帳戶類的設(shè)計(jì)本節(jié)中,我們?cè)O(shè)計(jì)一個(gè)銀行賬戶類,其中包括賬號(hào)、儲(chǔ)戶姓名、儲(chǔ)戶身份證號(hào)、日期、金額、余額、累計(jì)余額等屬性,存款、取款、查詢等方法,并使用自己的包存儲(chǔ)該類。程序如下所示:/銀行帳戶的屬性有賬號(hào)、儲(chǔ)戶姓名、儲(chǔ)戶身份證號(hào)、日期、金額、余額、累計(jì)余額/銀行帳戶的方法有存款、取款、查詢等,package myaccount;class Account fi

38、nal int Max=5; /操作的次數(shù) private int top; /儲(chǔ)戶帳目管理的指針 private int Ac_id; /賬號(hào) private String Ac_name; /儲(chǔ)戶姓名 private long Ac_card; /儲(chǔ)戶身份證號(hào) private String Ac_date=new StringMax; /日期 private int Ac_money=new intMax; /金額 private int Ac_rest=new intMax; /余額 private static int Ac_sum=0; /累計(jì)余額 public Account()

39、/構(gòu)造函數(shù),設(shè)置各參數(shù) top=0; /儲(chǔ)戶帳目管理的指針 Ac_id=0; /賬號(hào) Ac_name=; /儲(chǔ)戶姓名 Ac_card=0; /儲(chǔ)戶身份證號(hào) void Ac_in(String Ac_name,String aAc_date,int aAc_money)/定義存款的方法 Ac_datetop=aAc_date; Ac_moneytop=aAc_money; Ac_sum=Ac_sum+aAc_money; Ac_resttop=Ac_sum; System.out.println(儲(chǔ)戶姓名+Ac_name+日期+ Ac_datetop+存入+ Ac_moneytop+存款余額+A

40、c_resttop); top+; void Ac_out(String Ac_name,String aAc_date,int aAc_money)/定義存款的方法 Ac_datetop=aAc_date; Ac_moneytop=-aAc_money; Ac_sum=Ac_sum-aAc_money; Ac_resttop=Ac_sum; System.out.println(儲(chǔ)戶姓名+Ac_name+日期+ Ac_datetop+取出+ (-Ac_moneytop)+存款余額+Ac_resttop); top+; void Ac_ask(String Ac_name,String aAc

41、_date)/定義查詢的方法 Ac_datetop=aAc_date; Ac_moneytop=0; Ac_resttop=Ac_sum; System.out.println(儲(chǔ)戶姓名+Ac_name+日期+ Ac_datetop+查詢存款余額+Ac_resttop); top+; public class BankAccount public static void main(String args) /利用實(shí)例,調(diào)用儲(chǔ)蓄用戶 Account zhang =new Account(); zhang.Ac_in(張梁,2003.6.6,3000); zhang.Ac_out(張梁,2003.

42、6.8,2000); zhang.Ac_in(張梁,2003.7.7,3000); zhang.Ac_out(張梁,2003.7.9,1500); zhang.Ac_ask(張梁,2003.7.10); Account li =new Account(); li.Ac_in(李巖,2003.8.6,3000); li.Ac_in(李巖,2003.8.7,2000); li.Ac_in(李巖,2003.9.7,3000); li.Ac_out(李巖,2003.9.9,1500); li.Ac_ask(李巖,2003.9.10); 程序中我們創(chuàng)建了銀行儲(chǔ)戶類Account,在其中定義了相關(guān)的屬性和

43、方法,為了體現(xiàn)封裝。我們將所有的屬性都定義為私有的訪問權(quán)限,使用方法對(duì)這些屬性進(jìn)行操作,并將類放到了自定義的包中,最后使用BankAccount類對(duì)程序進(jìn)行了測(cè)試。程序運(yùn)行結(jié)果如圖3-10所示。圖3-10程序BankAccount運(yùn)行結(jié)果小結(jié)Java通過類和對(duì)象來組織和構(gòu)建程序。類包括類的聲明和類的主體。類的聲明使用如下格式:修飾符 class extends 父類名 implements 接口名。其中的修飾符確定了類的特性和訪問權(quán)限。abstract類是抽象類,final類是最終類,public具有公共訪問權(quán)限,默認(rèn)類具有包的訪問權(quán)限。類的主體包括成員變量和成員方法,聲明成員變量的格式為:修

44、飾符 聲明成員方法的格式為: ( 參數(shù)列表 ) throws 變量和方法的修飾符用以表明其特性。public表明該成員可以被任何類訪問,private表明該成員只能被該類所訪問,protected表明該成員可以被同一包中所有類及其他包中該類的子類所訪問,final表明該成員是不可被改變的,static表明該成員是類的成員或者說是一個(gè)靜態(tài)成員變量,是一個(gè)類所有對(duì)象共同擁有的。沒有任何修飾符則為默認(rèn)訪問權(quán)限,表明該成員可以被同一包中的所有類所訪問。abstract表明此方法是抽象的,必須被覆蓋。類的主體中還包括一個(gè)與類名相同無返回值的特殊方法,這就是構(gòu)造函數(shù)。構(gòu)造函數(shù)用來對(duì)對(duì)象進(jìn)行初始化。Java

45、虛擬機(jī)會(huì)自動(dòng)為類生成一個(gè)無參數(shù)的默認(rèn)構(gòu)造函數(shù),但如果程序中定義了一個(gè)或多個(gè)構(gòu)造函數(shù),則會(huì)屏蔽掉默認(rèn)的構(gòu)造函數(shù)。有些方法在使用時(shí)需要為其傳送參數(shù),this引用可以把當(dāng)前對(duì)象作為參數(shù)傳遞到方法中。類設(shè)計(jì)好以后,就可以用來定義對(duì)象,其格式為: = new 構(gòu)造函數(shù) ( )對(duì)象是一種引用類型,存放的是實(shí)際對(duì)象的內(nèi)存地址。使用對(duì)象名來訪問對(duì)象的成員變量和方法,以實(shí)現(xiàn)對(duì)對(duì)象的操作,完成程序的功能。通常對(duì)對(duì)象的成員變量和方法的訪問是使用成員運(yùn)算符“”。包是類的組織結(jié)構(gòu)。創(chuàng)建包使用import語句,并要作為源文件的第一句。引入包使用import語句,它緊接著package語句后面(如果package 語句存在的話)。包主要用來管理Java中的類并提供訪問控制。實(shí)訓(xùn)3一、實(shí)訓(xùn)目的1. 類的定義,對(duì)象的創(chuàng)建及使用,構(gòu)造函數(shù)的使用。2. 包的創(chuàng)建及使用,類及其成員的訪問權(quán)限。3. 理解靜態(tài)和非靜態(tài)成員變量的區(qū)別。4. 學(xué)會(huì)創(chuàng)建自己的包。二、 實(shí)訓(xùn)內(nèi)容1. 編寫一個(gè)學(xué)校類,其中包括成員變量scoreLine(錄取分?jǐn)?shù)線)和對(duì)該變量進(jìn)行設(shè)置和獲取的方法。學(xué)校類僅包括靜態(tài)成員變量和方法。2. 編寫一個(gè)學(xué)生類,她的成員變量有考生的name(姓名)、id(考號(hào))、intgre

溫馨提示

  • 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)論