版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第3章類與對象12/5/202313.1Java語言的類3.1.1系統(tǒng)定義的類1、java.*包(核心包):Applet,AWT,Beans,IO,Lang,Math,Net,SQL,Util等.2、Javax.*包:Swing,Securing,Rmi等3、org.*組織擴(kuò)展包:CORBA和XML
用import來引入這些包.12/5/202323.1.2用戶自定義類1、類、對象與對象引用(1)類(class)
類是Java中的一種重要的復(fù)合數(shù)據(jù)類型,是組成Java程序的基本要素,它封裝了一類對象的狀態(tài)和方法,是這一類對象的原型。創(chuàng)建一個(gè)新的類,就是創(chuàng)建一個(gè)新的數(shù)據(jù)類型。實(shí)例化一個(gè)類,就得到該類的一個(gè)對象。類(class)是可以由用戶自己定義的引用類型,它是相似對象的軟件抽象、創(chuàng)建對象的模板。每一個(gè)類都組合了一些能夠反映某種類型屬性的字段和反映某種類型動(dòng)作的方法。12/5/20233
(2)對象(Object)對象是一個(gè)人、地址、物品、事件、概念、屏幕顯示或者報(bào)表,它屬于某一個(gè)類,對象擁有自己的屬性值和方法調(diào)用。每一個(gè)類都將存在許多相互獨(dú)立的對象。通常說一個(gè)對象是類的一個(gè)實(shí)例,一個(gè)對象的生命周期包括聲明、創(chuàng)建、使用和清除4個(gè)狀態(tài)。在Java語言中只能引用對象,無法聲明一個(gè)直接包含對象的變量。類的變量實(shí)際上只是擁有對象的地址,而不是擁有對象本身。所有對象總是且只是通過內(nèi)存引用訪問的,這種方式稱為間接尋址(Indirectaddressing)。絕對不可以直接涉及對象,而只能通過一個(gè)保留地址的變量訪問對象。通常情況下,類類型變量稱為引用變量,它們并不直接保留對象,只是保留對象的地址,通過引用變量即可以得到一個(gè)對象。12/5/20234classConstructor{ publicConstructor() { System.out.println("調(diào)用構(gòu)造方法"); }}publicclassInitConstructor{ publicstaticvoidmain(Stringst[]) { newConstructor(); }}12/5/202352、類的定義修飾符class類名稱//開始定義類{程序區(qū)段;//定義類的屬性與方法}//完成類定義[public][abstract|final]classclassName[extendssuperclassName][implementsinterfaceNameList]{…//propertyandthemethoddeclarations}//endofclass12/5/20236訪問控制權(quán)public、缺省
一個(gè)Java源文件中最多只能有一個(gè)public類,而且文件名必須和public類的類名相同,擁有main()方法的類中;其它為輔助類。
(2)修飾符①abstract當(dāng)一個(gè)類前加上了abstract,表示該類是抽象類,所謂抽象類的意思是該類必須被繼承,本身不實(shí)現(xiàn)任何實(shí)際操作,該類中至少有一個(gè)抽象方法;當(dāng)一個(gè)類中,如果出現(xiàn)了某一個(gè)abstract的方法,那么這個(gè)類的前面也必須加上abstract的修飾符。12/5/20237②finalfinal如果一個(gè)類上加了final這個(gè)修飾符,那么這個(gè)類就不能被任何其他的類所繼承,也就是說,這個(gè)類絕后了。當(dāng)不希望某個(gè)類被其他類繼承時(shí),就可以將該類標(biāo)識為final。Java沒有限制public,abstract和final的次序??梢詫懗蓀ublicabstract,publicfinal,abstractpublic或者finalpublic(對編譯器而言都是一樣的)。
abstract不能與final共同修飾同一類12/5/202382、屬性(property或attribute)
屬性就是類的成員變量(membervariable)或成員數(shù)據(jù)(memberdata)(字段或域(field))。當(dāng)定義一個(gè)屬性時(shí),必須在類內(nèi)定義,并告訴Java這個(gè)屬性的數(shù)據(jù)類型是什么?以及存取控制的等級是什么?完成定義后,當(dāng)程序執(zhí)行時(shí),計(jì)算機(jī)才知道要分配多少內(nèi)存來存儲這個(gè)屬性,以及哪些對象可以存取此屬性。其語法如下:修飾符數(shù)據(jù)類型屬性名稱;
[public|protected|private][static][final][transient][volatile]
type
variableName;12/5/20239存取等級
同一類
同一package不同package其它類
子類
其它類子類public可
可
可
可
可
private可
不可
不可不可不可protected可
可
可
不可可
default可
可
可
不可不可(1)訪問控制符12/5/202310設(shè)計(jì)類成員訪問控制的最常用策略是將所有數(shù)據(jù)成員聲明為私有的,以實(shí)現(xiàn)信息隱藏;將所有方法成員聲明為公有的,以供其他程序片段使用。這種設(shè)計(jì)模式的好處是,當(dāng)一個(gè)類的屬性表示方法發(fā)生變化時(shí),只需修改類中一些方法成員的方法體代碼,只要該類能保持所有方法成員的接口及其實(shí)現(xiàn)的功能不變,那么上述變化就不會(huì)影響到使用該類的其他程序。12/5/202311
如果設(shè)計(jì)的類中有一個(gè)數(shù)據(jù)成員需要對外公開,就要仔細(xì)研究其他程序片段是僅僅需要讀取該數(shù)據(jù)成員的值,還是需要修改該數(shù)據(jù)成員的值。若是前者則仍應(yīng)將數(shù)據(jù)成員聲明為私有的,然后提供一個(gè)返回該數(shù)據(jù)的公有方法成員;若是后者則有兩種處理方式:一是將數(shù)據(jù)成員聲明為公有,二是將數(shù)據(jù)成員聲明為私有并提供一個(gè)公有的訪問方法和一個(gè)公有的修改方法。返回私有數(shù)據(jù)成員的那些公有方法成員又稱getter方法,因?yàn)檫@些公有方法通常命名為get…()(注意對布爾類型返回值通常命名為is…());修改私有數(shù)據(jù)成員的那些公有方法成員又稱setter方法,因?yàn)檫@些方法通常命名為set…()。12/5/202312classPerson//類名{ privateStringaddress;//籍貫 privateStringname;//姓名 privateintage;//年齡 publicStringgetName()//獲取人名 {returnname;} publicintgetAge()//獲取年齡 {returnage; } publicvoidchangeName(Stringnew_name)//改名 {name=new_name; } publicvoidincrementAge()//增加1歲 {age++; } publicvoidsetAge(intnew_age)//設(shè)置年齡 {age=new_age;}12/5/202313
publicStringgetAddress()//獲取籍貫 {returnaddress;} publicvoidsetAddress(Stringx)//設(shè)置籍貫 { address=x; } publicStringtoString()//讀對象信息 { Strings="Name:"+name+"\n"; s+="Age:"+age+"\n"; s+="Address:"+address+"\n"; returns; }}12/5/202314classBase{ publicintattPublic=50; privateintattPrivate=50;} publicclassAccessControl1{ publicstaticvoidmain(Stringargs[]) { BaseA_Base=newBase(); System.out.println(“在不同類中存取public屬性");System.out.println("attPublic:"+A_Base.attPublic);
//輸出A_Base對象的attPublic屬性 //System.out.println("attPrivate:“+A_Base.attPrivate); }}12/5/202315執(zhí)行結(jié)果:
在不同類中存取public屬性attPublic:50
注意:訪問描述符關(guān)鍵字不能作為方法的局部變量和參數(shù)變量聲明的一部分12/5/202316(2)修飾符
成員變量的聲明可以帶下面的修飾符(modifier)關(guān)鍵字:final或volatile,static,transient。
①final:將一個(gè)成員變量聲明為final時(shí),編譯器保證對這個(gè)成員變量進(jìn)行初始化,并且在以后將它看做一個(gè)常量。編譯器可以在程序的字節(jié)碼上執(zhí)行內(nèi)部優(yōu)化,因?yàn)樗爸馈背A坎粫?huì)發(fā)生改變(默認(rèn)情況下,一個(gè)成員變量是可讀/寫的)。
②volatile用于聲明一個(gè)共享變量,一般用在多個(gè)并發(fā)線程共享變量時(shí),這樣各個(gè)線程對變量的訪問就可以保持一致。12/5/202317
③static:當(dāng)一個(gè)成員變量被聲明為static時(shí),聲明這個(gè)成員變量的類所創(chuàng)建的所有對象共享這個(gè)成員變量的一個(gè)副本。給這個(gè)成員變量賦新值會(huì)讓所有對象“看到”這個(gè)新值(默認(rèn)情況下,每個(gè)對象有自己的一個(gè)成員變量副本)。
④transient用來聲明一個(gè)暫時(shí)性變量,指示Java虛擬機(jī)該變量不屬于對象的永久狀態(tài),對象存檔時(shí)不必保存該變量,而缺省情況下,類中所有變量都是對象永久狀態(tài)的一部分,當(dāng)對象被存檔時(shí),這些變量必須同時(shí)保存。注意:修飾符關(guān)鍵字不能作為方法的參數(shù)變量聲明的一部分,而且除了final以外,修飾符也不能作為方法的局部變量聲明的一部分。12/5/202318publicclassAccount//銀行賬戶{//銀行賬戶的屬性privatedoublebalance=0;//存款余額
//向賬戶中存款,存款金額為amountpublicvoiddeposit(doubleamount){balance=balance+amount;}
//從賬戶中取款,取款金額為amount;取款成功返回true,否則返回falsepublicbooleanwithdraw(doubleamount){if(amount<=balance){balance=balance-amount;returntrue;}elsereturnfalse;}
//查詢賬戶的當(dāng)前余額publicdoublegetBalance(){returnbalance;}}12/5/2023193.2對象的創(chuàng)建與引用3.2.1對象的創(chuàng)建與訪問對象成員
創(chuàng)建對象包括三步:
對象的聲明對象的實(shí)例化對象的初始化12/5/202320publicclassTestPerson{publicstaticvoidmain(Stringargs[]){Personp1=newPerson();Personp2=newPerson(); p1.changeName("John"); p1.setAge(23); p1.setAddress("江西"); p1.incrementAge(); p2.changeName("MaryAnn"); p2.setAge(22); p2.setAddress("北京"); System.out.println("姓名="+p1.getName()+",地址="+p1.getAddress());System.out.println("姓名="+p2.getName()+",地址="+p2.getAddress());
//System.out.println(p1); //System.out.println(p2);}}12/5/202321publicStringtoString()toString()方法返回當(dāng)前對象的字符串表示形式,返回的字符串中包括當(dāng)前對象對應(yīng)的類名、一個(gè)@符號和一個(gè)該對象的hash碼的無符號十六進(jìn)制描述(Java賦予當(dāng)前對象的標(biāo)識碼)。希望用戶開發(fā)類都重載toString()方法使其返回能反映當(dāng)前對象特點(diǎn)的字符串.12/5/2023223.2.2對象的初始化和構(gòu)造方法1、默認(rèn)值:
定義屬性時(shí)沒有指定初始值,則系統(tǒng)自動(dòng)指定初值。2、定義屬性成員時(shí)指定初值。3、用代碼塊設(shè)置初始化值4、使用構(gòu)造方法給對象初始化12/5/2023231、定義屬性時(shí)沒有指定初始值使用默認(rèn)值classCourse//Course是課程類名{ //定義成員變量 privateintcNumber;//課程編號 privateStringcName;//課程名 privateintcUnit;//學(xué)分?jǐn)?shù)
//定義成員方法 voidsetCNumber(intNumber)//成員方法setCNumber { cNumber=Number;} intgetCNumber()//成員方法getCNumber { returncNumber; } voidsetCName(StringName)//成員方法setCName { cName=Name; } StringgetCName() //成員方法getCName { returncName; }12/5/202324voidsetCUnit(intUnit)//成員方法setCUnit { cUnit=Unit; }intgetCUnit() //成員方法getCUnit {returncUnit;}}publicclassInitialDemo1{publicstaticvoidmain(String[]args){ Coursecs1=newCourse();//聲明一個(gè)Course對象cs1 System.out.println(cs1.getCNumber()); System.out.println(cs1.getCName()); System.out.println(cs1.getCUnit());}}12/5/2023252、定義屬性成員時(shí)初始化classCourse//Course是課程類名{ intcNumber=1;//課程編號 StringcName="Wang";//課程名 intcUnit=2;//學(xué)分?jǐn)?shù) } publicclassInitialDemo2{ publicstaticvoidmain(String[]args) { Coursecs1=newCourse();//聲明一個(gè)Course對象cs1 System.out.println(cs1.cNumber); System.out.println(cs1.cName); System.out.println(cs1.cUnit); }}12/5/2023263、通過初始化塊來設(shè)置對象的初始值publicclassClassExample{//聲明成員屬性,可以是靜態(tài)的或非靜態(tài)的inti;staticintj;
//靜態(tài)初始化語句塊static{ j=10; System.out.println("Instaticinitializer."); System.out.println("j="+j);}
//實(shí)例初始化語句塊{ i=10; System.out.println("Ininstanceinitializer.");System.out.println("i="+i);}12/5/202327//構(gòu)造方法publicClassExample(){System.out.println("Inconstructor.");}publicstaticvoidmain(String[]args){ newClassExample();}}12/5/2023284、使用構(gòu)造方法初始化構(gòu)造方法:(1)構(gòu)造方法名與類名相同。(2)構(gòu)造方法的作用是給對象賦初值,沒有返回值,但不需要用void來指明這一點(diǎn)。(3)構(gòu)造方法不能被程序顯式調(diào)用,即不應(yīng)該向其它方法一樣來使用構(gòu)造方法。(4)構(gòu)造方法可以在類中由編程者定義,若編程者沒有定義,系統(tǒng)將自動(dòng)生成一個(gè)構(gòu)造方法(默認(rèn)構(gòu)造方法),來完成對象創(chuàng)建時(shí)的初始化工作。(5)構(gòu)造方法可以通過重載實(shí)現(xiàn)不同的初始化方法。(6)構(gòu)造方法可以用public修飾或缺省(7)編程者一旦定義了構(gòu)造方法,就不能再調(diào)用默認(rèn)構(gòu)造方法。12/5/202329classCourse//Course是課程類名{ //定義成員變量 intcNumber=1;//課程編號 StringcName;//課程名 intcUnit=2;//學(xué)分?jǐn)?shù) Course(StringName,intUnit)//構(gòu)造方法 { cName=Name; cUnit=Unit; } }12/5/202330publicclassInitialDemo3{ publicstaticvoidmain(String[]args) {//使用類中聲明的構(gòu)造方法聲明一個(gè)Course對象cs1Coursecs1=newCourse(“Zhang”,6);System.out.println(cs1.cNumber); System.out.println(cs1.cName); System.out.println(cs1.cUnit); }}12/5/202331復(fù)制構(gòu)造方法復(fù)制構(gòu)造方法就是將傳入的對象的狀態(tài)值取出并設(shè)置新創(chuàng)建的對象,使之成為新對象的狀態(tài),如此一來,可使兩個(gè)對象有相同的狀態(tài),可是卻是指向不同的對象。12/5/202332classCircle{ doubleradius; Circle(Circleacircle) {radius=acircle.radius; } Circle(doublerad) { radius=rad; } voidsetRadius(doubleradi) { radius=radi; } voidshowRadius() { System.out.println("半徑為:"+radius); return; } doubleshowArea() { returnMath.PI*Math.pow(radius,2);}}12/5/202333publicclassCircleConstructor{publicstaticvoidmain(String[]args){ Circleacirc; acirc=newCircle(12.0); Circlebcirc=newCircle(acirc); bcirc.showRadius(); acirc.setRadius(14.0); bcirc.showRadius(); System.out.println(“acirc的面積等于"+acirc.showArea());System.out.println(“acirc的面積等于"+bcirc.showArea());}}12/5/202334例3-212/5/2023353.3變量作用域
變量的作用域也稱變量的有效范圍,它是程序的一個(gè)區(qū)域,變量在其作用域內(nèi)可以通過名字來引用。變量分為4類情形:
成員變量局部變量方法參數(shù)異常處理參數(shù)12/5/202336publicclassScope{intx;//成員變量inty;//成員變量的初始化代碼{ x=2; y=1;}publicvoidmethod(inta)//方法參變量在整個(gè)方法內(nèi)有效{ intx=5;//局部變量將成員變量隱藏 for(inti=1;i<a;i++)//在循環(huán)內(nèi)定義的變量i只在循環(huán)內(nèi)有效 { x=x+i; } System.out.println("x="+x+",y="+y+",a="+a);}publicstaticvoidmain(String[]args){ Scopex=newScope(); x.method(6);}}12/5/2023373.4類變量和靜態(tài)方法3.4.1變量(實(shí)例變量和類變量)1、實(shí)例成員變量在類體中聲明但不使用關(guān)鍵字static修飾符,則這個(gè)成員變量稱為實(shí)例成員變量(instancevariable),也稱為非靜態(tài)成員變量。①它在對象初始化時(shí)完成相應(yīng)的初始化工作②每個(gè)對象都擁有自己的實(shí)例變量③實(shí)例變量的作用域是某一個(gè)類具體創(chuàng)建的實(shí)例對象
12/5/202338實(shí)例成員變量與對象相關(guān),而不與類相關(guān)聯(lián)。在修改一個(gè)實(shí)例成員變量的時(shí)候,只有與這個(gè)成員變量相關(guān)的對象才能看到所發(fā)生的變化。實(shí)例成員變量在創(chuàng)建對象時(shí)被創(chuàng)建,在刪除對象時(shí)被刪除。classInstanceFieldDemo{doubled=1234.5;}當(dāng)JVM創(chuàng)建一個(gè)InstanceFieldDemo對象時(shí),它為d分配內(nèi)存,并且將1234.5賦給這個(gè)成員變量。12/5/202339
但如果不對一個(gè)實(shí)例成員變量進(jìn)行顯式的賦值,JVM就會(huì)將這個(gè)域的內(nèi)存清為零,這個(gè)動(dòng)作為實(shí)例成員變量設(shè)了一個(gè)默認(rèn)值。默認(rèn)值的解釋方法取決于實(shí)例成員變量的類型,例如:一個(gè)對象類型實(shí)例成員變量的默認(rèn)值為null;一個(gè)數(shù)字類型實(shí)例成員變量的默認(rèn)值為0或0.0;一個(gè)布爾類型實(shí)例成員變量的默認(rèn)值為false;一個(gè)字符類型實(shí)例成員變量的默認(rèn)值為\u0000。
12/5/2023402、類成員變量(Classvariable)類變量必須在類體中聲明,并且使用關(guān)鍵字static,因此也稱為靜態(tài)變量。①類變量在類被加載時(shí)完成相應(yīng)的初始化工作。②類變量在一個(gè)運(yùn)行系統(tǒng)中只有一份供整個(gè)類和實(shí)例對象共享的值,該值有可能被類(及其子類)和它們所創(chuàng)建的實(shí)例改變,每一次的改變都將影響到該類(及其子類)和其他實(shí)例的調(diào)用。③類變量的作用域是整個(gè)類。④類成員變量與類相關(guān),而不與對象相關(guān)聯(lián)。12/5/202341在修改一個(gè)類成員變量的時(shí)候,類(以及從這個(gè)類創(chuàng)建的對象)“看到”所發(fā)生的變化。類成員變量在加載類的時(shí)候被創(chuàng)建,在卸載類的時(shí)候被刪除(某些JVM會(huì)卸載執(zhí)行程序不再使用的類,以釋放內(nèi)存空間)。下面的代碼片段聲明了一個(gè)ClassFieldDemo類,其中包含類成員變量count的聲明:
classClassFieldDemo{staticintcount;}當(dāng)JVM加載c1assFieldDemo類時(shí),它為count分配內(nèi)存,并且將這個(gè)成員變量的內(nèi)存清零。將count設(shè)為默認(rèn)值0。注意:靜態(tài)代碼塊也在類加載時(shí)被執(zhí)行。12/5/20234212/5/2023433、訪問成員變量
當(dāng)你聲明一個(gè)類時(shí),需要編寫代碼來訪問成員變量。如何訪問一個(gè)成員變量取決于下面這些因素:●成員變量是一個(gè)實(shí)例成員變量還是一個(gè)類成員變量●代碼是通過同一個(gè)類的實(shí)例方法還是類方法來訪問這個(gè)成員變量●代碼是通過其他類的實(shí)例方法還是類方法來訪問這個(gè)成員變量例子:12/5/202344前面的例子說明了以下成員變量訪問規(guī)則:(1)如果用同一個(gè)類的實(shí)例方法訪問實(shí)例成員變量,只需要指定成員變量名。(2)如果用同一個(gè)類的類方法訪問實(shí)例成員變量,則必須創(chuàng)建一個(gè)對象,然后使用對象引用(帶句點(diǎn)分隔符)來訪問這個(gè)成員變量。但是在進(jìn)行這些操作的時(shí)候,是通過一個(gè)對象的上下文,而不是類的上下文來實(shí)現(xiàn)的。(3)如果從同一個(gè)類的實(shí)例方法訪問類成員變量,只需要指定成員變量名。(4)如果從同一個(gè)類的類方法訪問類成員變量,只需要指定成員變量名。12/5/202345(5)如果從另一個(gè)類的實(shí)例方法訪問實(shí)例成員變量,則必須創(chuàng)建一個(gè)對象,然后用對象引用(帶句點(diǎn)分隔符)來訪問實(shí)例成員變量。但是在進(jìn)行這些操作的時(shí)候,是通過一個(gè)對象的上下文,而不是實(shí)例方法來實(shí)現(xiàn)的。(6)如果從另一個(gè)類的類方法訪問實(shí)例成員變量,則必須創(chuàng)建一個(gè)對象,然后使用對象引用(帶句點(diǎn)分隔符)來訪問這個(gè)成員變量。但是在進(jìn)行這些操作的時(shí)候,是通過一個(gè)對象的上下文,而不是類的上下文來實(shí)現(xiàn)的。(7)如果從另一個(gè)類的類方法訪問類成員變量,則必須在類成員變量之前加上類名(帶句點(diǎn)分隔符)。(8)如果從另一個(gè)類的實(shí)例方法訪問類成員變量,則必須在類成員變量之前加上類名(帶句點(diǎn)分隔符)。注意:如果直接從類方法訪問實(shí)例成員變量,編譯器將會(huì)報(bào)錯(cuò)。12/5/2023463.4.2方法(實(shí)例方法和類方法)
方法表示一個(gè)對象的行為或者一個(gè)類的行為。在面向?qū)ο缶幊讨校袨橹傅氖且粋€(gè)對象向另一個(gè)對象發(fā)送的消息。發(fā)送消息的對象稱為發(fā)送方(或源),接受消息的一方稱為接受方(或目的)。12/5/2023471、方法定義修飾符返回?cái)?shù)據(jù)類型方法名稱(參數(shù)串行){…//程序語句return返回值;}[(public|private|protected)]([abstract]|[final][static][native][synchronized])typemethodIdentifier([parameterList]){[statement]...}12/5/202348存取等級
同一類
同一package不同package其它類
子類
其它類子類public可
可
可
可
可
private可
不可
不可不可不可protected可
可
可
不可可
default可可
可
不可不可(1)訪問描述符(方法的存取控制)
方法可以使用下面的訪問描述符關(guān)鍵字:public,private或protected以及無修飾符4種。此關(guān)鍵字決定了這個(gè)方法對于其他類中代碼的可訪問程度。訪問的范圍從完全可訪問到完全不可訪問。12/5/202349(2)修飾符一個(gè)方法可以用下列修飾符關(guān)鍵字進(jìn)行聲明:abstract或final,static,native,或synchronized。這幾個(gè)修飾符的作用分別是將方法變?yōu)槌橄蟮?只帶一個(gè)語法格式),將實(shí)例方法轉(zhuǎn)換為類方法,讓Java方法調(diào)用與平臺相關(guān)的庫的本地代碼,以及將方法的執(zhí)行限制到一個(gè)線程上。①當(dāng)一個(gè)方法聲明帶abstract關(guān)鍵字時(shí),它只由方法語法格式組成——沒有語句塊。另外這個(gè)方法所在的類也必須聲明為abstract。最后,一個(gè)abstract方法不能聲明為final,static,native,synchronized或者private(默認(rèn)情況下,方法不是抽象的,它需要執(zhí)行一個(gè)語句塊)。12/5/202350②當(dāng)一個(gè)方法聲明為final時(shí),這個(gè)方法不能進(jìn)行重載。換句話說,一個(gè)子類不能引入這個(gè)方法的新版本(默認(rèn)情況下,一個(gè)子類可以重載一個(gè)方法)。③當(dāng)一個(gè)方法聲明為static時(shí),這個(gè)方法只能訪問類成員變量,不能訪問實(shí)例成員變量(默認(rèn)情況下,一個(gè)方法可以訪問實(shí)例成員變量和類成員變量)。12/5/202351④當(dāng)一個(gè)方法聲明為native時(shí),JVM為本地方法調(diào)用做出安排,讓執(zhí)行傳入本地庫代碼中。雖然這個(gè)功能可能有用(例如訪問特殊平臺的特殊功能),但是從平臺無關(guān)性的角度講,不提倡這種做法,它可能導(dǎo)致穩(wěn)定性和安全性方面的問題。支持本地方法是因?yàn)闃?biāo)準(zhǔn)庫的這個(gè)部分(例如文件輸人/輸出部分)需要訪問底層平臺來執(zhí)行其任務(wù)(默認(rèn)情況下,一個(gè)方法不是本地的。⑤當(dāng)一個(gè)方法聲明為synchronized時(shí),只能同時(shí)有一個(gè)線程執(zhí)行方法的語句塊,其他等待訪問這個(gè)方法的線程被迫等到當(dāng)前執(zhí)行線程從這個(gè)方法中返回的時(shí)候,才得以執(zhí)行(默認(rèn)情況下,一個(gè)方法不是同步的)。12/5/2023522、實(shí)例方法和類方法(1)實(shí)例方法:①如果聲明方法時(shí)沒有用static修飾符關(guān)鍵字,那么這個(gè)方法就稱為實(shí)例方法(instancemethod)。②實(shí)例方法與對象相關(guān)聯(lián),而不與類相關(guān)聯(lián)。③實(shí)例方法可以訪問實(shí)例成員變量和類成員變量。下面的代碼片段聲明了Truck類,它帶一個(gè)實(shí)例方法setColor(),將參數(shù)c的內(nèi)容賦給color實(shí)例成員變量:classTruck{privateColorcolor;voidsetColor(Colorc){color=c;}}12/5/202353(2)類方法①如果一個(gè)方法是用static修飾符關(guān)鍵字來描述的,則稱這個(gè)方法為一個(gè)類方法(classmethod)。②類方法與類相關(guān)聯(lián),而不與對象相關(guān)聯(lián)。③類方法只能訪問類成員變量。下面的代碼片段聲明了一個(gè)CircleTools類,它用一個(gè)circumference()類方法來訪問類成員變量PI:classCircleTools{finalstaticdoublePI=3.14159;staticdoublecircumference(doublediameter){returnPI*diameter;}}12/5/2023543、調(diào)用方法在聲明一個(gè)類時(shí),需要編寫調(diào)用方法的代碼。代碼如何調(diào)用一個(gè)方法取決于以下因素:●這個(gè)方法是一個(gè)實(shí)例方法還是一個(gè)類方法;●代碼是通過同在一個(gè)類的實(shí)例方法還是類方法來調(diào)用這個(gè)方法;●代碼是通過不在一個(gè)類的實(shí)例方法還是類方法來調(diào)用這個(gè)方法。
無論如何,調(diào)用方法的代碼稱為方法調(diào)用(methodcall),由方法名與參數(shù)列表組成。例子12/5/202355前面的例子說明了以下方法調(diào)用規(guī)則:(1)如果實(shí)例方法調(diào)用同一個(gè)類的實(shí)例方法,只需要指定方法的名字。(2)如果類方法調(diào)用同一個(gè)類的實(shí)例方法,則必須創(chuàng)建一個(gè)對象,然后用對象引用(帶句點(diǎn)分隔符)來調(diào)用這個(gè)方法。但是在進(jìn)行這個(gè)操作時(shí),是通過對象方法的上下文,而不是類方法的上下文來調(diào)用這個(gè)方法的。(3)如果從實(shí)例方法調(diào)用同一個(gè)類的類方法,只需要指定方法的名字。(4)如果從類方法調(diào)用同一個(gè)類的類方法,只需要指定方法的名字。12/5/202356(5)如果從實(shí)例方法調(diào)用另一個(gè)類的實(shí)例方法,則必須創(chuàng)建一個(gè)對象,然后用對象引用(帶句點(diǎn)分隔符)來調(diào)用這個(gè)方法。但是在進(jìn)行這個(gè)操作時(shí),是通過對象方法的上下文,而不是類方法的上下文來調(diào)用這個(gè)方法的。(6)如果從類方法調(diào)用另一個(gè)類的實(shí)例方法,則必須創(chuàng)建一個(gè)對象,然后用對象引用(帶句點(diǎn)分隔符)來調(diào)用這個(gè)方法。但是在進(jìn)行這個(gè)操作時(shí),是通過對象方法的上下文,而不是類方法的上下文來調(diào)用這個(gè)方法的。(7)如果從實(shí)例方法調(diào)用另一個(gè)類的類方法,則必須在類方法之前加上類名(帶句點(diǎn)分隔符)作為前綴。(8)如果從類方法調(diào)用另一個(gè)類的類方法,則必須在類方法之前加上類名(帶句點(diǎn)分隔符)作為前綴。12/5/202357關(guān)于方法的總結(jié)1.方法的定義(包括訪問權(quán)控制符和修飾符)2.實(shí)例方法和類(靜態(tài))方法3.構(gòu)造方法4.方法的調(diào)用方式(傳值調(diào)用和傳址調(diào)用)5.方法的返回值(返回值、返回引用(返回對象、返回?cái)?shù)組))6.方法的重載、重構(gòu)12/5/202358例3-412/5/202359例3-5求10~100之間的所有素?cái)?shù)。publicclassfindPrime{publicstaticbooleanprime(intn){for(intk=2;k<=Math.sqrt(n);k++)if(n%k==0)returnfalse;returntrue;}publicstaticvoidmain(Stringargs[]){for(intm=10;m<=100;m++)if(prime(m))System.out.print(m+",");}}12/5/2023603.5使用包組織類對象重用是面向?qū)ο缶幊痰闹饕獌?yōu)點(diǎn)之一,在Java語言中,對象是以類的形式體現(xiàn)的,因此對象重用也就體現(xiàn)在類的重用上。一個(gè)類如果要在多個(gè)場合反復(fù)調(diào)用,可以把它存放在“包”中,這里的包實(shí)際上就是一組類組成的集合。包是一種松散的類的集合,通常,把具有共性的類放到同一個(gè)包中。包的組織采用分層結(jié)構(gòu),與文件系統(tǒng)中目錄的組織對應(yīng)一致,通常將邏輯相關(guān)的類放在同一個(gè)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 租房協(xié)議書游戲
- 2025年度個(gè)人住房按揭貸款合同協(xié)議3篇
- 2025年度個(gè)人房產(chǎn)租賃押金返還融資協(xié)議4篇
- 2025年度鋼材貿(mào)易代理與結(jié)算服務(wù)合同
- 2025-2030全球單深位旋轉(zhuǎn)伸縮貨叉行業(yè)調(diào)研及趨勢分析報(bào)告
- 2025-2030全球奶酪凝乳酶行業(yè)調(diào)研及趨勢分析報(bào)告
- 2025-2030全球棉籽濃縮蛋白 (CPC)行業(yè)調(diào)研及趨勢分析報(bào)告
- 2024年軍隊(duì)文職人員招聘考試《教育學(xué)》模擬卷2
- 外教聘請中介合同合同協(xié)議
- 2025年度個(gè)人挖掘機(jī)租賃安全責(zé)任合同4篇
- 2024公路瀝青路面結(jié)構(gòu)內(nèi)部狀況三維探地雷達(dá)快速檢測規(guī)程
- 浙江省臺州市2021-2022學(xué)年高一上學(xué)期期末質(zhì)量評估政治試題 含解析
- 2024年高考真題-地理(河北卷) 含答案
- 中國高血壓防治指南(2024年修訂版)解讀課件
- 2024年浙江省中考科學(xué)試卷
- 初三科目綜合模擬卷
- 2024風(fēng)力發(fā)電葉片維保作業(yè)技術(shù)規(guī)范
- 《思想道德與法治》課程教學(xué)大綱
- 2024光儲充一體化系統(tǒng)解決方案
- 2024年全國高考新課標(biāo)卷物理真題(含答案)
- 處理后事授權(quán)委托書
評論
0/150
提交評論