類和對(duì)象課件_第1頁(yè)
類和對(duì)象課件_第2頁(yè)
類和對(duì)象課件_第3頁(yè)
類和對(duì)象課件_第4頁(yè)
類和對(duì)象課件_第5頁(yè)
已閱讀5頁(yè),還剩37頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

類和對(duì)象

28九月202523.1面向?qū)ο蟮某绦蛟O(shè)計(jì)方法概述

3.1.1抽象

抽象是人們解決問(wèn)題的主要手段,也是面向?qū)ο蟪绦蛟O(shè)計(jì)解決實(shí)際問(wèn)題法寶之一。所謂抽象就是指從眾多的事物面向?qū)ο蟪绦蛟O(shè)計(jì)標(biāo)志著程序設(shè)計(jì)思想發(fā)展到一個(gè)新的高度,它用一種更符合人們認(rèn)識(shí)客觀世界的思維方式進(jìn)行程序設(shè)計(jì):相對(duì)于面向過(guò)程的程序設(shè)計(jì)以研究問(wèn)題的解決過(guò)程為主體,面向?qū)ο缶幊淌且詫?duì)象為主體,使編程富于創(chuàng)造性,提高了程序的可重用性,簡(jiǎn)化了編程過(guò)程,同時(shí)也使程序更易于維護(hù)。28九月20253中舍棄個(gè)別的、非本質(zhì)的屬性,抽出共同的、本質(zhì)的屬性的過(guò)程。是面向?qū)ο蟪绦蛟O(shè)計(jì)的核心概念。用面向?qū)ο缶幊探鉀Q現(xiàn)實(shí)世界的問(wèn)題時(shí),首先是利用抽象技術(shù)將現(xiàn)實(shí)世界中的各種實(shí)體,歸納總結(jié)出共性的東西形成一類實(shí)體的基本特征。這些特征包括屬性和行為,這些本質(zhì)屬性和方法的有機(jī)組合,就是面向?qū)ο蠓椒ㄖ械念悺?.1.2封裝

封裝性是面向?qū)ο缶幊痰幕咎匦灾?,它通過(guò)封裝隱蔽了對(duì)象的內(nèi)部實(shí)現(xiàn)細(xì)節(jié)。對(duì)象的封裝有兩個(gè)方面:28九月20254一方面表示對(duì)象的屬性和方法是不可分割的整體。對(duì)象的屬性和方法封裝為一體具有重要的意義,因?yàn)樗从沉藢?duì)象同時(shí)具有了客觀事物的靜態(tài)特征和動(dòng)態(tài)行為相統(tǒng)一的客觀規(guī)律,使軟件對(duì)客觀事物的描述更接近人類表述;而過(guò)去的面向過(guò)程的編程語(yǔ)言都是將功能和數(shù)據(jù)相分離,使軟件對(duì)客觀事物的描述存在偏差,很難自然地用語(yǔ)言表達(dá)客觀事物的對(duì)應(yīng)關(guān)系。另一方面,封裝還表示對(duì)象內(nèi)部細(xì)節(jié)的隱蔽性。對(duì)內(nèi)部細(xì)節(jié)的隱蔽性反映了事物客觀的相對(duì)獨(dú)立性,這樣既可以防止外界的干擾,又可以降低復(fù)雜性。在java語(yǔ)言中,對(duì)象、類和包逐層封裝,為管理大量的對(duì)象和類提供了方便,也增強(qiáng)了語(yǔ)言的安全性。隱藏了內(nèi)部細(xì)節(jié)也使得java的使用者和設(shè)計(jì)者分離,使用者只需用接口去滿足軟件重用的策略,可以降低軟件開(kāi)發(fā)成本,縮短開(kāi)發(fā)周期,是軟件的開(kāi)發(fā)和維護(hù)得到根本性的改善。28九月20255訪問(wèn)對(duì)象,而不必知道對(duì)象的內(nèi)部細(xì)節(jié)。從軟件工程的角度講,封裝也符合模塊化設(shè)計(jì)原則,滿足軟件重用的策略,可以降低軟件開(kāi)發(fā)成本,縮短開(kāi)發(fā)周期,是軟件的開(kāi)發(fā)和維護(hù)得到根本性的改善。3.1.3

繼承面向?qū)ο蟪绦蛟O(shè)計(jì)的另一重要特點(diǎn)是類的繼承性。繼承是讓一個(gè)類成為另一個(gè)類的子類,子類繼承父類的所有特性,并可以擴(kuò)充自己的特性。這種關(guān)系為共享數(shù)據(jù)和操作提供了一種良好的機(jī)制。繼承提高了軟件的重用性、可用性和界面的一致性。根據(jù)繼承的特性,可以將繼承分為如下兩種主要形式:28九月20256(1)直接繼承和間接繼承。如果類c的定義直接繼承于類b,則稱c直接繼承于b,且b是c的直接父類;如果又有b類又直接繼承于a類,則可稱c類間接繼承于a類。間接繼承體現(xiàn)了繼承關(guān)系的可傳遞性。(2)單繼承和多繼承。如果一個(gè)類只有一個(gè)直接父類,則稱該關(guān)系為單繼承;如果一個(gè)類有多于一個(gè)以上的父類,則稱該繼承關(guān)系為多繼承。Java語(yǔ)言只支持單繼承,而不支持多繼承。3.1.4

多態(tài)多態(tài)性也是面向?qū)ο缶幊痰囊粋€(gè)特性,它反映了現(xiàn)實(shí)世界中謀類事物中的每個(gè)實(shí)體,都具有一些不同于其它實(shí)體的某些方面,也是針對(duì)于類中有相似功能的28九月20257不同方法以同一方法名來(lái)定義。這樣,可以用相同的方式調(diào)用不同的同名方法。Java中通過(guò)方法的重寫和方法重載類實(shí)現(xiàn)多態(tài)。3.2類

類是組成java程序的基本要素,也是java程序設(shè)計(jì)的重要思想表現(xiàn)。作為程序的基本要素,類封裝了某個(gè)對(duì)象范疇的狀態(tài)和方法,可以看作定義對(duì)象的模板。3.2.1類聲明類聲明的最一般格式為:[類修飾符]class類名[extends父類名][implements[,接口名]28九月20258{…//類體}其中,[]中的元素表示可選項(xiàng)。大括號(hào)對(duì)“{}”及之間的內(nèi)容為類體。類修飾符表示類的性質(zhì),主要是對(duì)于訪問(wèn)權(quán)限的限定。類的修飾符主要有:

l

Public公共類修飾符。表示可以被相同包中的類繼承或訪問(wèn),而不同包中的類也可以通過(guò)import引用后再繼承或訪問(wèn)。l

Final終結(jié)類修飾符。這將在第五章介紹。l

Abstract抽象類修飾符。它沒(méi)有方法的實(shí)現(xiàn),也沒(méi)有構(gòu)造方法。不能用new運(yùn)算符實(shí)例化。不能被繼承。也將在第五章進(jìn)行詳細(xì)介紹。28九月20259class表示類聲明的開(kāi)始,class為關(guān)鍵字,用來(lái)定義類?!癱lass類名”部分用來(lái)聲明類。類名必須符合java對(duì)標(biāo)識(shí)符的命名標(biāo)準(zhǔn),如果類名使用拉丁字母,習(xí)慣上首字母使用大寫;類名為容易識(shí)別的關(guān)系可用多個(gè)單詞復(fù)合而成,此時(shí)習(xí)慣每個(gè)單詞首字母大寫。關(guān)鍵字extends表示類繼承了某個(gè)父類,父類名必須是java標(biāo)準(zhǔn)類名或程序本身已定義過(guò)的類名。關(guān)鍵字implements表示繼承某個(gè)接口,若有多個(gè)接口則接口間用逗號(hào)隔開(kāi)。3.2.2類體

類是創(chuàng)建對(duì)象的模板,因此它應(yīng)該能夠描述一類事物共有的屬性和功能,這個(gè)描述過(guò)程由類體實(shí)現(xiàn)。類聲明之后的一對(duì)大括號(hào)“{”、“}”以及它們之間的內(nèi)容稱28九月202510做類體,大括號(hào)之間的內(nèi)容稱做類體的內(nèi)容。類體的內(nèi)容由兩部分構(gòu)成:一部分是變量的定義,用來(lái)刻畫事物的屬性;另一部分是方法的定義,用來(lái)描述事物的功能。例子3.1:定義一個(gè)People類,類體內(nèi)容的變量定義部分定義了1個(gè)double類型變量“身高”、1個(gè)布爾類型變量“性別”、兩個(gè)個(gè)字符串類型變量“姓名”和“職業(yè)”,和一個(gè)方法“人物簡(jiǎn)介”。classPeople{double身高;//定義變量部分

booblean性別=true;//定義變量時(shí)可以同時(shí)進(jìn)行賦值

String姓名,職業(yè);

publicvoid人物間介()//方法定義

{

System.out.println(“個(gè)人基本資料:”+姓名+性別+身高+職業(yè));}}28九月202511當(dāng)然,上述類的定義還可以有別的屬性,如“婚否”等,也可以有別的方法,如“業(yè)余愛(ài)好”等。特別注意的是:在變量定義部分可以將變量定義部分可以和變量的賦值同時(shí)進(jìn)行,但不可以如下這樣做:classPeople{double身高;//定義變量部分

booblean性別;//定義變量和賦值分開(kāi)進(jìn)行

性別=true;

…因?yàn)椋酉庐嬀€的語(yǔ)句屬于對(duì)變量操作語(yǔ)句,而不是定義語(yǔ)句。所有變量的操作語(yǔ)句只能放在方法種進(jìn)行。28九月2025123.2.4類的變量上一節(jié)提到類體分為變量定義和方法兩部分。變量除了在類體變量定義部分進(jìn)行定義外,還可以在方法內(nèi)部定義;另外,成員變量又可以分為靜態(tài)變量和實(shí)例變量。1)成員變量的定義格式[修飾符]變量類型變量名=初值;其中,變量名應(yīng)為合法的標(biāo)識(shí)符,盡量做到見(jiàn)名知意;變量類型通常指變量的基本數(shù)據(jù)類型。其中變量類型和變量名兩項(xiàng)不可以省略。有時(shí)候某些類的實(shí)例也會(huì)作為類的成員變量,對(duì)象成員的定義格式如下:類名對(duì)象名=new類名([參數(shù)表]);大家可以類比一下普通變量和對(duì)象定義的關(guān)系。28九月202513

1)變量的修飾符變量的修飾符有進(jìn)行訪問(wèn)控制的修飾符和非訪問(wèn)控制的修飾符兩種,主要的訪問(wèn)控制修飾符有public、protected等,這些修飾符主要在繼承等訪問(wèn)時(shí)進(jìn)行訪問(wèn)權(quán)限的控制,將在第五章進(jìn)行詳細(xì)介紹;非訪問(wèn)控制符主要有static、final等,將在后面單獨(dú)介紹。2)成員變量和局部變量變量按照定義的位置,可以分為成員變量和局部變量。變量定義部分定義的變量稱為類的成員變量,成員變量在整個(gè)方法內(nèi)有效,且和它在類體中書寫的順序無(wú)關(guān);在方法內(nèi)部定義的變量或方法的參數(shù)稱為局部變量,局部變量只在定義它的方法內(nèi)有效。例3.2:在例3.1的基礎(chǔ)上增加一些變量及方法。28九月202514classPeople{double身高;//全局變量

booblean性別=true;String姓名,職業(yè);

publicvoid人物間介() //方法定義{age=30; //合法,因?yàn)閍ge為全局變量,切合定義位置無(wú)關(guān)String愛(ài)好=“圍棋”; //局部變量

System.out.println(“個(gè)人基本資料:”+姓名+年齡+性別+身高+職業(yè)+愛(ài)好); }

intage;publicvoidspeak(Strings){System.out.println(“我的娛樂(lè)是”+愛(ài)好);//非法,變量愛(ài)好是局部變量}}在變量定義過(guò)程中,有時(shí)會(huì)出現(xiàn)成員變量和局部變量同名的情況,此時(shí),在出現(xiàn)局部變量的方法中,同名的成員變量會(huì)被隱藏,即這個(gè)成員變量會(huì)在這個(gè)方法內(nèi)暫時(shí)失效。28九月202515如:classTest{inta=30;publicstaticvoidmian(args[]) {inta=60;System.out.println(“a=”+a);}}程序輸出結(jié)果為a=60,因?yàn)槿肿兞縜對(duì)于main方法來(lái)說(shuō),已經(jīng)失效。但有的時(shí)候還需要在出現(xiàn)上述情況的方法中還使用全局變量,就必須使用關(guān)鍵字this。特別是希望某些方法得到的參數(shù)作為全局變量來(lái)用時(shí),如下例所示。例3.3:編寫一個(gè)類,能夠根據(jù)一個(gè)方法的參數(shù)來(lái)修改全局變量a。classTest{

28九月202516staticStringa=“全局變量”;

publicString修改字符串(Stringa) {Stringa;this.a=a;//方法中的參數(shù)和全局變量同一化

System.out.println(“a=”+a);}}

1)靜態(tài)成員變量(類成員變量或類變量)與實(shí)例成員變量(實(shí)例變量)如果成員變量的類型關(guān)鍵字前面有關(guān)鍵字static,這樣的成員變量稱作類變量或靜態(tài)成員變量。如:classdog{floatx;//實(shí)例成員變量

staticinty;//類變量…}28九月202517如果一個(gè)類中的某個(gè)成員變量是類變量,那么所有類的實(shí)例對(duì)象的這個(gè)類變量都分配給同一處的內(nèi)存,修改了其中一個(gè)對(duì)象的這個(gè)類變量,其他類的這個(gè)類變量也會(huì)隨之改變。也就是說(shuō),類變量被所有對(duì)象共享。3.2.3構(gòu)造方法

根據(jù)類創(chuàng)建對(duì)象時(shí),總是使用一個(gè)特殊的方法來(lái)初始化對(duì)象,這個(gè)方法稱為構(gòu)造方法。構(gòu)造方法的名字要求與類同名(包括大小寫),且無(wú)返回值。在創(chuàng)建對(duì)象時(shí),java語(yǔ)言都會(huì)自動(dòng)調(diào)用構(gòu)造方法為新對(duì)象進(jìn)行初始化。一個(gè)類可以創(chuàng)建多個(gè)構(gòu)造方法,但必須具有不同的參數(shù),也就是說(shuō),構(gòu)造方法可以重載。利用不同參數(shù)調(diào)用不同的構(gòu)造方法,可以實(shí)現(xiàn)對(duì)象的不同初始化。例3.4:還是people類的定義:28九月202518classPeople{Stringname,career;booleansex;//true代表女,false代表男

intage;doubleheight;//從姓名、年齡角度分析people類時(shí)使用

publicPeople(Stringname,intage) { =name; this.age=age;System.out.println(“姓名:”+name+“\n”+“年齡:”+age); }//從性別、職業(yè)角度分析people類時(shí)使用publicPeople(Stringcareer,booleansex) { this.career=career; this.sex=sex;System.out.println(“性別:”+sex+“\n”+“年齡:”+age); } publicPeople()//如果有前面定義的構(gòu)造方法,最好也定義此構(gòu)造方法: { }}28九月202519使用構(gòu)造方法進(jìn)行初始化的好處是避免了在生成對(duì)象后每次都調(diào)用對(duì)象的初始化方法,構(gòu)造方法內(nèi)部成員遵循前面局部變量的使用規(guī)則??偨Y(jié)構(gòu)造方法有以下特點(diǎn):l

構(gòu)造方法名與類名必須大小寫及拼寫完全一致。l

構(gòu)造方法用于對(duì)象初始化,不需返回值,但是不必用void說(shuō)明。l

構(gòu)造方法不能被程序調(diào)用,只能通過(guò)new運(yùn)算符調(diào)用。l

構(gòu)造方法可由編程人員在類中定義,當(dāng)用戶沒(méi)有定義時(shí),java語(yǔ)言會(huì)自動(dòng)生成一個(gè)為空的構(gòu)造方法,當(dāng)用new調(diào)用默認(rèn)的構(gòu)造方法時(shí),對(duì)象被初始化為內(nèi)部各數(shù)據(jù)相應(yīng)數(shù)據(jù)類型的默認(rèn)值;但是當(dāng)用戶定義有構(gòu)造方法時(shí),默認(rèn)的構(gòu)造方法會(huì)失效,如果還要用的話,最好把默認(rèn)的構(gòu)造方法顯式地定義出來(lái)。28九月202520構(gòu)造方法對(duì)于創(chuàng)建對(duì)象非常關(guān)鍵。雖然在大多數(shù)情況下,類的對(duì)象都是調(diào)用有參數(shù)的構(gòu)造方法,方便對(duì)象變量的初始化。

同時(shí),類定義時(shí)如果沒(méi)有聲明任何構(gòu)造方法,系統(tǒng)會(huì)賦給此來(lái)一個(gè)默認(rèn)(無(wú)參)的構(gòu)造方法。但是,一旦用戶在類中聲明了構(gòu)造方法(有參),系統(tǒng)將不會(huì)再賦給這個(gè)類默認(rèn)的構(gòu)造方法了。所以,好的習(xí)慣是:要么不聲明構(gòu)造方法,要么聲明兩個(gè)以上構(gòu)造方法,兩個(gè)中包括一個(gè)無(wú)參數(shù)的構(gòu)造方法。3.2.5終結(jié)函數(shù)終結(jié)方法:finalize(),該方法包含在java.Long.Object類中。java語(yǔ)言自動(dòng)管理內(nèi)存,可以自動(dòng)進(jìn)行垃圾收集,在收集前自動(dòng)調(diào)用對(duì)象的finalize()方法來(lái)釋放系統(tǒng)資源。finalize方法28九月202521很相似c++中的析構(gòu)函數(shù)。但由于java有垃圾回收機(jī)制,并且java垃圾回收器的使用不由程序員控制,也無(wú)規(guī)律可循,有可能在程序終止時(shí)都沒(méi)有啟動(dòng)的機(jī)會(huì)。因此,這樣的資源回收并不是可靠的方法。這種垃圾回收器的不確定性,有時(shí)會(huì)給程序運(yùn)行帶來(lái)麻煩,比如說(shuō)在某段時(shí)間系統(tǒng)產(chǎn)生了大量的待釋放資源卻無(wú)法有效釋放。為了解決這種麻煩,java里提供了System.gc()方法,使用這個(gè)方法,可以強(qiáng)制啟動(dòng)垃圾回收器,進(jìn)而自動(dòng)執(zhí)行finalize()方法。例3.5:一個(gè)finalize的一個(gè)典型應(yīng)用示例。classPerson{ publicvoidfinalize() { System.out.println("theobjectisgone!"); }

28九月202522publicstaticvoidmain(String[]args) { newPerson(); newPerson(); newPerson();System.gc(); System.out.println("theprogramisending!"); }}運(yùn)行結(jié)果如圖3-1。

圖3-1對(duì)象的釋放

3.2.6類方法和實(shí)例方法28九月202523正如成員變量分為類變量和實(shí)例變量一樣,類的方法也分為類方法和實(shí)例方法。如:classdog{floatx()//實(shí)例方法{…return…}staticinty();//類方法{…

return…}}若一個(gè)方法被聲明為類方法,則它只能對(duì)類變量進(jìn)行操作,且象類變量一樣,類的所有實(shí)例對(duì)象共享同一個(gè)類方法。如:28九月202524classtest{inta=3;staticintb;floatf(intx,inty){a=x;b=y;//變量引用合法,因?yàn)閒為實(shí)例方法returnx*y;}staticfloatg(intx,inty){a=x;b=2*a;//變量a引用不合法,因?yàn)間為類方法,而a為實(shí)例變量returnx*y;}}3.3

對(duì)象的創(chuàng)建和使用知道類是創(chuàng)建對(duì)象的模板。當(dāng)用一個(gè)類創(chuàng)建了一個(gè)對(duì)象時(shí),意味著一類事物中具體的某個(gè)客觀實(shí)體被程序表述了。在面相對(duì)對(duì)象的程序中,對(duì)象是由屬性和方法封裝而成,屬性是實(shí)體的一些特征值或構(gòu)件,方法是實(shí)體的功能和行為。28九月202525對(duì)象可以被看作復(fù)雜的數(shù)據(jù)結(jié)構(gòu)。一個(gè)對(duì)象的生命周期分為三個(gè)階段:生成、使用和清除。3.3.1創(chuàng)建對(duì)象創(chuàng)建一個(gè)對(duì)象包括兩個(gè)步驟:聲明對(duì)象和為對(duì)象分配內(nèi)存。1)對(duì)象的聲明一般格式為:類名對(duì)象名如:People張三這里people是前面定義的一個(gè)類的名字,張三是聲明對(duì)象的名字。但此時(shí)對(duì)象“張三”的內(nèi)存中沒(méi)有任何數(shù)據(jù),即“張三”還是一個(gè)空對(duì)象,不能使用。要是用這個(gè)對(duì)象還必須為這個(gè)對(duì)象分配內(nèi)存,也叫做為對(duì)象分配實(shí)體。28九月202526

1)為對(duì)象分配內(nèi)存為對(duì)象分配內(nèi)存,即使用new運(yùn)算符和類的構(gòu)造方法實(shí)例化某個(gè)對(duì)象。如果類中沒(méi)有構(gòu)造方法,系統(tǒng)會(huì)自動(dòng)調(diào)用默認(rèn)的構(gòu)造方法(沒(méi)有參數(shù),名字遵循普通構(gòu)造方法的要求:和類名相同),格式為對(duì)象名=new構(gòu)造方法名([參數(shù)1][,參數(shù)2]…);也可以把以上兩個(gè)步驟合在一起,格式為:類名對(duì)象名=new構(gòu)造方法名([參數(shù)1][,參數(shù)2]…);例3.6:創(chuàng)建people類的對(duì)象。classPeople{Stringname,career;booleansex=true;//true代表女,false代表男

intage;doubleheight; //從姓名、年齡角度分析people類時(shí)使用

publicPeople(Stringname,intage)

28九月202527{ =name; this.age=age; System.out.println("姓名:"+name+"年齡:"+age+"\n"); }//從性別、職業(yè)角度分析people類時(shí)使用:

publicPeople(Stringcareer,booleansex) { this.career=career; this.sex=sex; System.out.println("職業(yè):"+career+"性別:"+sex+"\n"); }publicPeople()//如果有前面定義的構(gòu)造方法,最好也定義此構(gòu)造方法 {

System.out.println(sex); }}classA{publicstaticvoidmain(Stringargs[]){

28九月202528//聲明對(duì)象并分配內(nèi)存

People張三=newPeople("張華",20);//從姓名、年齡創(chuàng)建對(duì)象

People李四=newPeople("自由職業(yè)者",true);//從職業(yè)、性別創(chuàng)建對(duì)象

People無(wú)名=newPeople();//用顯式定義的默認(rèn)構(gòu)造方法創(chuàng)建對(duì)象 }}編譯并運(yùn)行結(jié)果如圖3-2。

圖3-2創(chuàng)建對(duì)象

上述類A的main方法中的三條語(yǔ)句,創(chuàng)建了三個(gè)對(duì)象:張三、李四和無(wú)名,并且為這三個(gè)對(duì)象分配了內(nèi)存。執(zhí)行完后的內(nèi)存狀態(tài)如圖3-3所示。其中張三、李四和無(wú)名分別代表系統(tǒng)分配給三個(gè)對(duì)象的應(yīng)用句柄。

28九月202529圖3-3對(duì)象的內(nèi)存模型

28九月202530對(duì)象創(chuàng)建的一個(gè)主要任務(wù)是對(duì)象變量的賦值,即對(duì)象變量的初始化。初始化常用如下三種方式:l

定義類時(shí)在類體中用賦值語(yǔ)句進(jìn)行初始化。如例3.7中對(duì)象“張華”和“無(wú)名”的性別屬性,對(duì)象創(chuàng)建時(shí)沒(méi)有對(duì)sex賦值,若按照默認(rèn)的賦值應(yīng)為fale,但類定義時(shí)已經(jīng)賦值為true。l

使用構(gòu)造方法進(jìn)行初始化。如例3.7中對(duì)象“張華”的屬性:name和age,對(duì)象“李四”的屬性:career和sex。l

采用默認(rèn)的初始化。主要是用類默認(rèn)的構(gòu)造方法進(jìn)行初始化時(shí),默認(rèn)的構(gòu)造方法沒(méi)有參數(shù),并且成員變量在定義類時(shí)也沒(méi)有賦初值,這些變量便被初始化為變量類型默認(rèn)的初始值:整型變量默認(rèn)值是0,浮點(diǎn)型默認(rèn)為0.0f,雙精度型默認(rèn)為0.0d,布爾型默認(rèn)為false;對(duì)于引用型或復(fù)合類型數(shù)據(jù),如字符串等數(shù)據(jù),默認(rèn)初值均為null。28九月2025313.3.2對(duì)象的使用對(duì)象創(chuàng)建以后,就擁有了一套創(chuàng)建該對(duì)象的類中的變量和方法。對(duì)象就不僅可以操作自己的變量以改變自己的狀態(tài),同時(shí)還可以操作自己的方法,通過(guò)調(diào)用某些方法產(chǎn)生一定的行為。在程序中,對(duì)象的使用由幾種情況:訪問(wèn)對(duì)象的成員變量和調(diào)用成員方法;對(duì)象作為類的成員;對(duì)象作為方法參數(shù)和返回值。Java中總是通過(guò)使用運(yùn)算符“.”調(diào)用自己的變量或方法。例3.7:訪問(wèn)對(duì)象示例。classPoint//定義類Point{

intx,y;//定義成員變量

Point()//定義無(wú)參數(shù)構(gòu)造方法 {

x=0; y=0; }

28九月202532Point(intx,inty)//定義帶參數(shù)構(gòu)造方法{

this.x=x; this.y=y;}

voidmove(intx1,inty1)//定義move方法{

x=x1;y=y1; }}publicclassObj{ publicstaticvoidmain(Stringargs[]) {Pointp1=newPoint(0,0);//生成對(duì)象

p1.move(5,5);//調(diào)用成員方法moveSystem.out.println("x="+p1.x+"y="+p1.y);//訪問(wèn)成員變量 }}此程序中Point類有三個(gè)方法。主類中的main方法中,調(diào)用了Point類對(duì)象的move方法。程序的運(yùn)行結(jié)果:x=5y=528九月202533另外,因?yàn)閷?duì)象也是一種變量,因此它可作為數(shù)組元素、類的成員、也可以出現(xiàn)在成員方法的參數(shù)表和方法體中。3.3.3在類定義內(nèi)調(diào)用方法類中的方法之間能互相調(diào)用。方法可以對(duì)變量進(jìn)行處理,也可以把其他方法的處理結(jié)果作為參數(shù)進(jìn)行處理,以完成更復(fù)雜的工作。1)方法調(diào)用規(guī)則l

實(shí)例方法可以調(diào)用該類中的其他任何方法。l

類方法只能調(diào)用該類中的其他類方法,不能調(diào)用實(shí)例方法。下面是一個(gè)實(shí)例方法和類方法之間互相調(diào)用以及方法處理變量的的綜合例子:28九月202534classtest{inta=3;staticintb;floatf(intx,inty){a=x;b=y;//變量引用合法,因?yàn)閒為實(shí)例方法returnx*y;}staticfloatg(intx,inty){a=x;b=2*a; //變量a引用不合法,因?yàn)間為類方法,而a為實(shí)例變量returnx*y;}

publicvoidstaticmain(Stringargs[]);//特殊的類方法{

System.out.println(a); //不合法System.out.println(f(1,2)); //不合法,f實(shí)例方法System.out.println(g(1,2)); //可以引用方法g,但方法g本身不合法}}2)方法調(diào)用的形式

28九月202535在創(chuàng)建方法時(shí),給出了這個(gè)方法行為的定義。為了使用方法,必須請(qǐng)求或者調(diào)用,基于一個(gè)方法是否有返回值有兩種方法來(lái)調(diào)用:l

如果方法有返回值,對(duì)它的調(diào)用通常作為一個(gè)數(shù)值來(lái)處理。例如:intlarger=max(3,4);調(diào)用max(3,4)并將這個(gè)方法的結(jié)果賦值給變量larger。同時(shí)也可以用作某些方法的參數(shù),如:System.out.println(max(3,4));它將方法作為參數(shù)并輸出顯示方法的返回值。l

如果方法沒(méi)有返回值,即void類型,則對(duì)這個(gè)方法的調(diào)用必定是一條語(yǔ)句。比如上邊的“System.out.println(max(3,4));”,println方法沒(méi)有方回值,重點(diǎn)是完成一定的功能。28九月2025363.4

參數(shù)的傳遞方法的功能是它與參數(shù)一起工作的能力。如可以使用println來(lái)打印任何信息,使用數(shù)學(xué)方法對(duì)任何數(shù)據(jù)進(jìn)行特定操作。

3.4.1以變量為參數(shù)調(diào)用方法以變量為參數(shù)調(diào)用方法,也就是基本數(shù)據(jù)類型的參數(shù)的傳遞。在調(diào)用方法時(shí),需要傳遞參數(shù),以實(shí)參代替形參。進(jìn)行參數(shù)傳遞時(shí)最基本的要求是實(shí)參必須與方法的形參用相同的順序給出,這稱為參數(shù)順序結(jié)合。如:publicvoidnprintln(Strings,intn){ for(intI=0;I<n;I++)System.out.println(s);}上述方法的調(diào)用語(yǔ)句可以是nprintln(“hello”,3),而不能寫成28九月202537nprintln(3,“hello”)。注意:不但要求參數(shù)順序相同,實(shí)參還必須在個(gè)數(shù)和兼容類型方面與在方法定義中的形參匹配。兼容類型意思是可以在沒(méi)有顯式強(qiáng)制的情況下給方法傳遞一個(gè)實(shí)參。3.4.2以數(shù)組作為參數(shù)或返回值的方法調(diào)用

向一個(gè)方法傳遞數(shù)組參數(shù)時(shí),數(shù)組的名字不用帶方括號(hào)。例如數(shù)組num的聲明語(yǔ)句為“intnum[]=newint[24]”。若要把數(shù)組num作為參數(shù)傳遞給某個(gè)方法時(shí),只需要將數(shù)組名num作為實(shí)參,因?yàn)榍懊?.4節(jié)中已經(jīng)介紹過(guò),java的數(shù)組大小是數(shù)組的length屬性,不需要單獨(dú)給出。盡管整個(gè)數(shù)組是用引用來(lái)傳遞的(即數(shù)組名代表數(shù)組的引用),但基本類型的每個(gè)數(shù)組元素仍用值傳遞,這與簡(jiǎn)單數(shù)據(jù)類型變量完全相同。這些簡(jiǎn)單的單個(gè)數(shù)據(jù)個(gè)體被稱為標(biāo)量或標(biāo)量數(shù)。為了向一個(gè)方法傳遞一個(gè)數(shù)組元素,可以在方法28九月202538調(diào)用中使用該數(shù)組元素帶下標(biāo)的名字作為參數(shù)。當(dāng)然,對(duì)于通過(guò)方法調(diào)用來(lái)接收數(shù)組的方法而言,該方法的形參表中必須指明要接受的數(shù)組。如方法modifyNum(inta[]),其中的參數(shù)“inta[]”表示方法將接受一個(gè)整數(shù)數(shù)組。由于數(shù)組是通過(guò)引用傳遞,當(dāng)被調(diào)用的方法使用數(shù)組名a時(shí),它指的是一個(gè)名為a的數(shù)組實(shí)際參數(shù)。例3.8:有數(shù)組num,編程首在瀏覽器中顯示數(shù)組num中的前5個(gè)元素。接著num被傳遞到方法modifyNum中,在這個(gè)方法中,num的每個(gè)元素被乘以3,然后顯示。importjava.applet.*;importjava.awt.*;publicclassPassArray_testextendsApplet{ intnum[]={1,2,3,4,5}; publicint[]mo

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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)論