Java實(shí)用教程:類與對(duì)象

Java實(shí)用教程:類與對(duì)象

深圳達(dá)內(nèi)教育      2022-04-29 04:28:01     11

Java實(shí)用教程:類與對(duì)象,  在日常生活中,在蓋房子之前要首先設(shè)計(jì)一個(gè)建筑圖紙,然后根據(jù)圖紙來蓋房子。所謂類,好比在日常生活中描述一個(gè)物品的信息,

課程價(jià)格 請(qǐng)咨詢

上課時(shí)段: 授課校區(qū):

詳細(xì)介紹

  在日常生活中,在蓋房子之前要首先設(shè)計(jì)一個(gè)建筑圖紙,然后根據(jù)圖紙來蓋房子。所謂類,好比在日常生活中描述一個(gè)物品的信息,如房子的建筑圖紙。而對(duì)象就好比實(shí)實(shí)在在的房子,編程語言同樣如此。



  6.1什么是面向?qū)ο?/p>


  所謂面向?qū)ο?,是指編寫程序的時(shí)候要圍繞著一個(gè)對(duì)象的功能進(jìn)行編寫的。


  6.1.1面向?qū)ο缶幊痰奶攸c(diǎn)


  面向?qū)ο缶幊痰目s寫是OOP,全稱為ObjectOrientedProgramming。在進(jìn)行面向?qū)ο蟮木幊虝r(shí),方法和成員變量都寫在具體的對(duì)象里,并對(duì)其成員變量和方法有很好的隱藏性。對(duì)象之間的訪問都是通過其接口進(jìn)行的。下面列舉面向?qū)ο缶幊痰奶攸c(diǎn),分為如下幾種。


  首先要說的是繼承。所謂繼承,是發(fā)生在類與類之間的,是子類共享父類成員變量和方法的一種模式。通過擴(kuò)展子類的方法可以使子類有比父類更加強(qiáng)大的功能。


  說明:繼承是面向?qū)ο缶幊痰奶攸c(diǎn),同樣也是Java的特點(diǎn),這里和其他語言有很大不同。


  示例代碼


  01//bike類描述的是一個(gè)自行車


  02classbike


  03{


  04}


  05


  06//racing_cycle類描述的是一個(gè)公路賽車,繼承自bike


  07classracing_cycleextendsbike


  08{


  09}


  提示:繼承是發(fā)生在類與類之間的。繼承可以是單繼承,也可以多層繼承。


  多態(tài)是指對(duì)象在運(yùn)行期和編譯期具有兩種狀態(tài),多態(tài)的使用使代碼具有了更多的靈活性和重用性。


  抽象是指在定義類的時(shí)候,確定了該類的一些行為和動(dòng)作。比如自行車可以移動(dòng),但怎么移動(dòng)不進(jìn)行說明。這種提前定義一些動(dòng)作和行為的類為抽象的。


  封裝是指對(duì)一件物品的描述信息是這個(gè)物品所特有的,是不能讓外界看到的一些成員變量和方法。在Java里成員變量和方法就被封裝在類里,需要通過一些特有的方法訪問它們。


  6.1.2面向?qū)ο缶幊膛c面向過程編程的區(qū)別


  面向過程是指在遇到問題的時(shí)候,怎么去解決這個(gè)問題,而分析問題的步驟,就是解決這個(gè)問題的方法,是通過方法一步一步來完成的。面向?qū)ο笫侵冈谟龅絾栴}的時(shí)候,把問題分解成各自獨(dú)立功能的類,而這個(gè)類是完成各自問題的。總結(jié)如下所述。


  面向過程和面向?qū)ο笞蠲黠@的區(qū)別就是,面向?qū)ο笫前凑找瓿傻墓δ軄韺?shí)現(xiàn)的,而面向過程是按照解決這個(gè)問題的步驟來實(shí)現(xiàn)的。


  面向?qū)ο笫前凑粘绦蛑械墓δ苓M(jìn)行劃分的。


  面向過程是按照問題的解決思路來劃分的,是一步一步來解決問題的。


  面向過程更看重的是完成問題的過程。


  面向?qū)ο蟾粗氐氖枪δ?,通過各種功能模塊的組合來完成問題。


  6.2什么是類


  所謂類是一種抽象的東西,描述的是一個(gè)物品的完整信息。比如房子和圖紙的關(guān)系。在Java里,圖紙就是類,定義了房子的各種信息,而房子是類的實(shí)體。


  6.2.1類的定義和對(duì)象的創(chuàng)建


  定義一個(gè)類表示定義了一個(gè)功能模塊。下面先介紹如何定義一個(gè)類,以及如何創(chuàng)建這個(gè)類的實(shí)例,即對(duì)象。類是通過關(guān)鍵字class來定義的,在class關(guān)鍵字后面加上類的名稱,這樣就創(chuàng)建了一個(gè)類。在類里面可以定義類的成員變量和方法。類的語法代碼如下所示。


  class類的名稱


  {


  //類的成員變量


  //類的方法


  }


  創(chuàng)建類的實(shí)例是通過new關(guān)鍵字來定義的,后面加上定義類時(shí)為類起的名稱,需要注意的是在類名后還需要一個(gè)括號(hào)。創(chuàng)建類的實(shí)例的代碼如下所示。


  new類的名稱();


  6.2.2如何使用現(xiàn)有類


  在定義一些類的時(shí)候,如何使用它們呢?這里需要分為多種情況。定義的類可以在一個(gè)包下面,也可以不在一個(gè)包下面,這在使用時(shí)是不同的。類又分為已有類和自定義類,它們之間的使用也是有區(qū)別的。下面就通過范例來講解在不同情況下如何使用類。


  【范例】在同目錄下使用類。首先是定義一個(gè)bike類,在該類中不存在任何成員變量和方法,這里只是演示如何在同一目錄下使用類。


  示例代碼


  01//bike.java


  02classbike


  03{


  04}


  接下來定義一個(gè)使用bike類的類。


  01//testBike.java


  02//在testBike類里使用了bike類


  03classtestBike


  04{


  05bikeb=newbike();


  06}


  6.2.3類設(shè)計(jì)的技巧


  設(shè)計(jì)一個(gè)類要明確這個(gè)所要完成的功能,類里的成員變量和方法是描述類的功能的。如果定義了和這個(gè)類不相關(guān)的成員變量和方法將不是一個(gè)良好的設(shè)計(jì)。


  【范例】示例代碼是一個(gè)不太好的類設(shè)計(jì)。


  示例代碼


  01publicclassbike


  02{


  03//這個(gè)成員變量描述的是自行車的顏色.


  04Stringcolor="黃色";


  05


  06//這個(gè)成員變量描述的是公路賽車的顏色,所以在這里不太合適


  07Stringracing_color="綠色";


  08}


  在本程序中定義了一個(gè)表示自行車顏色的color成員變量,又定義了一個(gè)表示賽車顏色的racing_color成員變量;而該程序是定義的一個(gè)bike自行車類,所以定義表示賽車顏色的racing_color成員變量是不太好的選擇。


  【范例6-8】示例代碼6-8是一個(gè)良好的類設(shè)計(jì)。


  示例代碼6-8


  01publicclassbike


  02{


  03//這個(gè)成員變量描述的是自行車的顏色


  04Stringcolor="黃色";


  05}


  01publicclassracing


  02{


  03//這個(gè)成員變量描述的是公路賽車的顏色


  04Stringracing_color="綠色";


  05}


  【代碼解析】在該范例中,定義了兩個(gè)類。其中bike類中只定義了一個(gè)表示自行車顏色的color成員變量。同樣在racing類中只定義了一個(gè)表示賽車顏色的racing_color成員變量。這種設(shè)計(jì)相對(duì)上一個(gè)范例中的設(shè)計(jì)要好得多,這樣使類和成員變量相對(duì)應(yīng),也使別人更容易讀懂代碼。


  6.3成員變量


  所謂成員變量就是這個(gè)類里定義的一些私有的變量.,這些變量是屬于這個(gè)類的。就好比日常生活中的自行車的大小,即這個(gè)車子是26還是28的,這個(gè)尺寸就是自行車的成員變量,是描述這個(gè)自行車的。下面開始介紹成員變量。


  6.3.1成員變量的創(chuàng)建


  成員變量描述的是這個(gè)類的一些屬性或狀態(tài)的,下面通過代碼來演示怎么定義成員變量。語法為:變量的類型變量的名稱。


  【范例】創(chuàng)建成員變量的一般形式。


  示例代碼


  01//bike類描述的是一個(gè)自行車


  02publicclassbike


  03{


  04//這個(gè)成員變量描述的是自行車的顏色.


  05Stringcolor;


  06


  07//這個(gè)成員變量描述的是自行車的大小,即尺寸.


  08Stringsize;


  09}


  在該程序中,定義了一個(gè)叫做bike的類,在該類中定義了兩個(gè)成員變量,一個(gè)是表示自行車顏色的color成員變量,一個(gè)是表示自行車型號(hào)的size成員變量。


  下面看一個(gè)創(chuàng)建成員變量的完整形式。


  代碼講解


  通過new關(guān)鍵字來創(chuàng)建這個(gè)bike類的對(duì)象,用bike類的對(duì)象引用b來給其成員變量賦值。因?yàn)槌蓡T變量是在這個(gè)類實(shí)例化后才能訪問到的。成員變量賦完值后,調(diào)用println語句來打印并顯示結(jié)果。


  6.3.2成員變量的初始化


  通過new關(guān)鍵字來創(chuàng)建一個(gè)對(duì)象后,會(huì)有一個(gè)系統(tǒng)默認(rèn)的初始值。所以說不管有沒有在創(chuàng)建成員變量的時(shí)候給變量一個(gè)值,系統(tǒng)都會(huì)有一個(gè)默認(rèn)的值。


  成員變量和對(duì)象的引用在申明的時(shí)候不對(duì)其賦初值,那么系統(tǒng)都會(huì)賦一個(gè)初值,具體的信息如表所示。

  6.4局部變量


  局部變量和成員變量很相似都是描述信息的。局部變量和成員變量的不同點(diǎn)就是局部變量是在方法體里創(chuàng)建的,在方法體外是訪問不到這個(gè)變量的。


  6.4.1局部變量的創(chuàng)建和初始化


  局部變量描述的是方法體的一些屬性或狀態(tài)的,下面通過代碼來演示怎么定義局部變量。創(chuàng)建局部變量的基本語法為:變量的類型變量的名稱。


  【范例】演示局部變量的例子。


  示例代碼


  01//test類描述的是基本類型的初始化


  02publicclasstest4


  03{


  04//程序的運(yùn)行函數(shù)即主入口函數(shù)


  05publicstaticvoidmain(Stringargs[])


  06{


  07//基本類型的局部變量


  08intsize=123;


  09booleanb=true;


  10//打印并顯示局部變量


  11System.out.println(size);


  12System.out.println(b);


  13}


  14}


  6.4.2局部變量和成員變量的區(qū)別


  局部變量描述的是這個(gè)方法體內(nèi)的屬性的,而成員變量描述的是這個(gè)對(duì)象里的屬性的,它們之間的區(qū)別,即訪問區(qū)別如下:


  成員變量可以被public、protected、default、private、static、final修飾符修飾。


  局部變量可以被final修飾符修飾,但不能修飾為public、protected、default、private、static。


  成員變量是在堆里進(jìn)行創(chuàng)建的,而局部變量是在棧里進(jìn)行創(chuàng)建的。


  成員變量是系統(tǒng)默認(rèn)值。


  局部變量沒有系統(tǒng)默認(rèn)值,必須手動(dòng)賦值。


  6.5方法


  每個(gè)人都有走、吃和睡等動(dòng)作。在Java中,所謂方法就好比日常生活中的一個(gè)動(dòng)作,是完成一系列操作的。在Java中也是如此,方法收到對(duì)象的信息,進(jìn)行處理的操作。


  6.5.1方法的創(chuàng)建和參數(shù)


  方法的參數(shù)是提供外界在執(zhí)行方法的時(shí)候提供給方法的特殊描述信息的,好比日常生活中的,用力砸東西,用大力砸東西。而這個(gè)用大力就是提供給這個(gè)進(jìn)行特殊描述的。


  創(chuàng)建方法的語法為:


  方法修飾符方法的返回類型方法名稱(方法參數(shù))


  {


  方法體


  }


  方法的定義如下所示。


  publicvoidadd(inti,intn)


  {


  System.out.println(i+n);


  }


  代碼說明:


  方法名稱為add,有兩個(gè)參數(shù)都是int類型的。


  方法體是打印i+n的值,并顯示出來。


 ?、俜椒ǖ男揎椃麨閜ublic類型的,修飾符可有可無。


 ?、诜椒ǖ姆祷仡愋陀泻芏喾N,主要分為如下幾類。


  ③方法返回值為void類型時(shí)為無返回值。


 ?、芊椒ǚ祷刂颠€可以為任意的類型,如String、Boolean、int。如果定義了方法的返回類型就⑤必須在方法體內(nèi)用return把返回值進(jìn)行返回。


  ⑥方法的返回值可以為null,但必須是對(duì)象類型?;绢愋筒荒芊祷豱ull。


 ?、咴诜祷刂禐榛绢愋偷臅r(shí)候,只要能夠自動(dòng)轉(zhuǎn)換就可返回。


 ?、喾椒ǖ膮?shù)也有多種形式,下面是對(duì)方法參數(shù)的討論。


  ⑨方法的參數(shù)可以為基本數(shù)據(jù)類型,也可以為對(duì)象引用類型。


 ?、饷總€(gè)參數(shù)都有完整的聲明該變量的形式。


  ?方法的參數(shù)可以有一個(gè),也可有多個(gè)。


  ?Java程序的入口main就為一個(gè)方法,參數(shù)為String[]args,它是個(gè)特殊的方法。


  6.5.2方法參數(shù)的傳遞


  參數(shù)的傳遞是傳遞的值還是引用呢。下面通過例子來分別說明,請(qǐng)仔細(xì)考慮。


  【范例】當(dāng)傳遞類型為基本類型時(shí),傳遞的是該類型的值。


  01//test類描述的是基本類型的傳遞


  02publicclasstest


  03{


  04//方法add是把傳入的參數(shù)進(jìn)行+1,并顯示其結(jié)果


  05publicvoidadd(inti)


  06{


  07i=i+1;


  08System.out.println(i);


  09}


  10


  11//程序的運(yùn)行方法,即主入口方法


  12publicstaticvoidmain(Stringargs[])


  13{


  14//基本類型的局部變量


  15intsize=44;


  16


  17//創(chuàng)建bike類的對(duì)象實(shí)例,即bike類的對(duì)象引用b


  18testt=newtest();


  19


  20//打印原來的值


  21System.out.println(size);


  22//運(yùn)行時(shí)的值


  23t.add(size);


  24//打印運(yùn)行后的值


  25System.out.println(size);


  26}


  27}


  在參數(shù)為基本類型進(jìn)行傳遞的時(shí)候,是傳遞的這個(gè)值的備份,即第二份。不論在方法中怎么改變這個(gè)備份,都不是操作原來的數(shù)據(jù),所以原來的值是不會(huì)改變的。


  當(dāng)傳遞的參數(shù)為對(duì)象引用類型時(shí),也是利用的傳值的方式進(jìn)行的。


  01//test類描述的是方法的傳遞


  02publicclasstest


  03{


  04publicstaticvoidmain(String[]args)


  05{


  06//創(chuàng)建一個(gè)對(duì)象類型


  07Strings=newString("Hello");


  08


  09//打印其值


  10System.out.println("before:"+s);


  11


  12//通過方法去改變其值


  13changeString(s);


  14


  15//打印方法改變的值和原值


  16System.out.println("changeString:"+s);


  17System.out.println("after:"+s);


  18}


  19


  20publicstaticvoidchangeString(Stringstr)


  21{


  22str=newString("hi");


  23str=str+"china!";


  24}


  25}


  當(dāng)把對(duì)象引用s傳遞到一個(gè)方法后,這個(gè)方法可以改變這個(gè)對(duì)象的屬性,并能返回相應(yīng)的改變。但這個(gè)對(duì)象引用指向的這個(gè)字符串s是永遠(yuǎn)不會(huì)改變的。這里傳遞對(duì)象引用后,又通過這個(gè)引用去創(chuàng)建了一個(gè)新的String類型的字符串,這兩個(gè)字符串在內(nèi)存中當(dāng)然不是同一個(gè)了。


  6.6對(duì)象引用的使用


  所謂對(duì)象引用就是該引用名稱指向內(nèi)存中的一個(gè)對(duì)象,通過調(diào)用該引用即可完成對(duì)該對(duì)象的操作。本節(jié)將要討論一些操作對(duì)象引用中將出現(xiàn)的一些常見問題。如不存在的對(duì)象、空引用、對(duì)象間的比較等問題,下面分別來說明。


  6.6.1調(diào)用不存在的對(duì)象或成員變量


  如果調(diào)用的對(duì)象或成員變量沒有創(chuàng)建,那么在編譯的時(shí)候編譯器將出現(xiàn)錯(cuò)誤。下面用代碼演示這個(gè)錯(cuò)誤,并演示如何修正。


  【范例】代碼演示訪問不存在的成員變量。


  示例代碼


  01//test類描述的是測(cè)試訪問不存在的成員變量


  02publicclasstest


  03{


  04//main方法為程序的入口函數(shù)


  05publicstaticvoidmain(String[]args)


  06{


  07//創(chuàng)建test類的對(duì)象實(shí)例


  08testt=newtest();


  09//t.a訪問的是一個(gè)不存在的成員變量,將提示不可識(shí)別的字段。


  10System.out.println(t.a);


  11}


  12}


  運(yùn)行將會(huì)發(fā)生如下異常。


  Exceptioninthread"main"java.lang.Error:Unresolvedcompilationproblem:


  t.acannotberesolvedorisnotafield


  attest.main(test.java:7)


  【代碼解析】對(duì)象引用t要訪問的是a這個(gè)成員變量,而a沒有聲明,在編譯的時(shí)候?qū)⑻崾惧e(cuò)誤信息。在錯(cuò)誤提示里,已經(jīng)提示為main方法里的第7行,只需查看這里就能找到錯(cuò)誤的所在。


  修改上述代碼使程序運(yùn)行通過。


  01//test類描述的是測(cè)試訪問不存在的成員變量


  02publicclasstest


  03{


  04//a為test類的成員變量


  05Stringa;


  06


  07//main方法為程序的入口方法


  08publicstaticvoidmain(String[]args)


  09{


  10//創(chuàng)建test類的對(duì)象實(shí)例


  11testt=newtest();


  12//t.a訪問的是一個(gè)不存在的成員變量,將提示不可識(shí)別的字段


  13System.out.println(t.a);


  14}


  15}


  根據(jù)上例中的錯(cuò)誤提示在test類聲明了一個(gè)名稱為a的成員變量。因?yàn)镾tring類型的a沒有進(jìn)行賦值,所以打印出來為null。


  6.6.2調(diào)用對(duì)象為null值的引用


  任何操作的對(duì)象的值為null的時(shí)候都將出現(xiàn)空指針錯(cuò)誤,即“NullPointException“錯(cuò)誤,因?yàn)槌蓡T變量和方法是屬于對(duì)象的,即屬于用new關(guān)鍵字創(chuàng)建出來的對(duì)象的。下面用代碼來演示這個(gè)錯(cuò)誤,并演示如何進(jìn)行修正。


  01//ArrayList類所需要的


  02importjava.util.ArrayList;


  03


  04//test類測(cè)試訪問null值的對(duì)象


  05publicclasstest


  06{


  07//聲明一個(gè)成員變量a并進(jìn)行初值


  08publicStringa="test類的成員變量";


  09


  10//Java程序的主入口方法


  11publicstaticvoidmain(String[]args)


  12{


  13//創(chuàng)建test類的對(duì)象實(shí)例


  14testt=newtest();


  15


  16//創(chuàng)建一個(gè)集合類,對(duì)象引用為一個(gè)null值


  17ArrayListal=null;


  18


  19//向一個(gè)null的集合對(duì)象里添加數(shù)據(jù)


  20al.add(t.a);


  21}


  22}


  ArrayList類為一個(gè)集合類和數(shù)組很相似,都是用來存儲(chǔ)數(shù)據(jù)用的。錯(cuò)誤提示在main方法里的20行,提示為NullPointerException,即空指針錯(cuò)誤。對(duì)象引用al聲明為一個(gè)null值,表示這個(gè)對(duì)象并沒有創(chuàng)建其對(duì)象的實(shí)例,只是一個(gè)引用而已。當(dāng)操作任意一個(gè)為null的對(duì)象的時(shí)候都將提示空指針錯(cuò)誤。


  6.6.3對(duì)象引用間的比較


  兩個(gè)對(duì)象引用進(jìn)行比較,比較的是這兩個(gè)對(duì)象的引用,而引用是在內(nèi)存中的一個(gè)地址。地址當(dāng)然是不能相同的了。下面通過一個(gè)例子來演示引用間的比較。


  【范例】演示兩個(gè)對(duì)象引用的比較。

  equals方法在這里比較的是對(duì)象的引用,因?yàn)閑quals方法是Object類的方法,而任何類的父類都為Object,equals方法是繼承過來的。繼承將在后面的章節(jié)里做詳細(xì)講解。用new關(guān)鍵字創(chuàng)建的對(duì)象地址是重新分配的,它們進(jìn)行比較,地址當(dāng)然是不同的了。


  6.7this


  this是Java保留的一個(gè)關(guān)鍵字,所謂this就好比日常生活中的“你我他”中的我,表示自己、本身的意思。在Java里也是如此,表示類的本身。


Java實(shí)用教程

培訓(xùn)啦提醒您:交易時(shí)請(qǐng)核實(shí)對(duì)方資質(zhì),對(duì)于過大宣傳或承諾需謹(jǐn)慎!任何要求預(yù)付定金、匯款等方式均存在風(fēng)險(xiǎn),謹(jǐn)防上當(dāng)。