更新時間:2019-08-23 11:21:22 來源:動力節點 瀏覽2639次
在日常生活中,在蓋房子之前要首先設計一個建筑圖紙,然后根據圖紙來蓋房子。所謂類,好比在日常生活中描述一個物品的信息,如房子的建筑圖紙。而對象就好比實實在在的房子,編程語言同樣如此。
6.1什么是面向對象
所謂面向對象,是指編寫程序的時候要圍繞著一個對象的功能進行編寫的。
6.1.1面向對象編程的特點
面向對象編程的縮寫是OOP,全稱為ObjectOrientedProgramming。在進行面向對象的編程時,方法和成員變量都寫在具體的對象里,并對其成員變量和方法有很好的隱藏性。對象之間的訪問都是通過其接口進行的。下面列舉面向對象編程的特點,分為如下幾種。
首先要說的是繼承。所謂繼承,是發生在類與類之間的,是子類共享父類成員變量和方法的一種模式。通過擴展子類的方法可以使子類有比父類更加強大的功能。
說明:繼承是面向對象編程的特點,同樣也是Java的特點,這里和其他語言有很大不同。
示例代碼
01//bike類描述的是一個自行車
02classbike
03{
04}
05
06//racing_cycle類描述的是一個公路賽車,繼承自bike
07classracing_cycleextendsbike
08{
09}
提示:繼承是發生在類與類之間的。繼承可以是單繼承,也可以多層繼承。
多態是指對象在運行期和編譯期具有兩種狀態,多態的使用使代碼具有了更多的靈活性和重用性。
抽象是指在定義類的時候,確定了該類的一些行為和動作。比如自行車可以移動,但怎么移動不進行說明。這種提前定義一些動作和行為的類為抽象的。
封裝是指對一件物品的描述信息是這個物品所特有的,是不能讓外界看到的一些成員變量和方法。在Java里成員變量和方法就被封裝在類里,需要通過一些特有的方法訪問它們。
6.1.2面向對象編程與面向過程編程的區別
面向過程是指在遇到問題的時候,怎么去解決這個問題,而分析問題的步驟,就是解決這個問題的方法,是通過方法一步一步來完成的。面向對象是指在遇到問題的時候,把問題分解成各自獨立功能的類,而這個類是完成各自問題的。總結如下所述。
面向過程和面向對象最明顯的區別就是,面向對象是按照要完成的功能來實現的,而面向過程是按照解決這個問題的步驟來實現的。
面向對象是按照程序中的功能進行劃分的。
面向過程是按照問題的解決思路來劃分的,是一步一步來解決問題的。
面向過程更看重的是完成問題的過程。
面向對象更看重的是功能,通過各種功能模塊的組合來完成問題。
6.2什么是類
所謂類是一種抽象的東西,描述的是一個物品的完整信息。比如房子和圖紙的關系。在Java里,圖紙就是類,定義了房子的各種信息,而房子是類的實體。
6.2.1類的定義和對象的創建
定義一個類表示定義了一個功能模塊。下面先介紹如何定義一個類,以及如何創建這個類的實例,即對象。類是通過關鍵字class來定義的,在class關鍵字后面加上類的名稱,這樣就創建了一個類。在類里面可以定義類的成員變量和方法。類的語法代碼如下所示。
class類的名稱
{
//類的成員變量
//類的方法
}
創建類的實例是通過new關鍵字來定義的,后面加上定義類時為類起的名稱,需要注意的是在類名后還需要一個括號。創建類的實例的代碼如下所示。
new類的名稱();
6.2.2如何使用現有類
在定義一些類的時候,如何使用它們呢?這里需要分為多種情況。定義的類可以在一個包下面,也可以不在一個包下面,這在使用時是不同的。類又分為已有類和自定義類,它們之間的使用也是有區別的。下面就通過范例來講解在不同情況下如何使用類。
【范例】在同目錄下使用類。首先是定義一個bike類,在該類中不存在任何成員變量和方法,這里只是演示如何在同一目錄下使用類。
示例代碼
01//bike.java
02classbike
03{
04}
接下來定義一個使用bike類的類。
01//testBike.java
02//在testBike類里使用了bike類
03classtestBike
04{
05bikeb=newbike();
06}
6.2.3類設計的技巧
設計一個類要明確這個所要完成的功能,類里的成員變量和方法是描述類的功能的。如果定義了和這個類不相關的成員變量和方法將不是一個良好的設計。
【范例】示例代碼是一個不太好的類設計。
示例代碼
01publicclassbike
02{
03//這個成員變量描述的是自行車的顏色.
04Stringcolor="黃色";
05
06//這個成員變量描述的是公路賽車的顏色,所以在這里不太合適
07Stringracing_color="綠色";
08}
在本程序中定義了一個表示自行車顏色的color成員變量,又定義了一個表示賽車顏色的racing_color成員變量;而該程序是定義的一個bike自行車類,所以定義表示賽車顏色的racing_color成員變量是不太好的選擇。
【范例6-8】示例代碼6-8是一個良好的類設計。
示例代碼6-8
01publicclassbike
02{
03//這個成員變量描述的是自行車的顏色
04Stringcolor="黃色";
05}
01publicclassracing
02{
03//這個成員變量描述的是公路賽車的顏色
04Stringracing_color="綠色";
05}
【代碼解析】在該范例中,定義了兩個類。其中bike類中只定義了一個表示自行車顏色的color成員變量。同樣在racing類中只定義了一個表示賽車顏色的racing_color成員變量。這種設計相對上一個范例中的設計要好得多,這樣使類和成員變量相對應,也使別人更容易讀懂代碼。
6.3成員變量
所謂成員變量就是這個類里定義的一些私有的變量.,這些變量是屬于這個類的。就好比日常生活中的自行車的大小,即這個車子是26還是28的,這個尺寸就是自行車的成員變量,是描述這個自行車的。下面開始介紹成員變量。
6.3.1成員變量的創建
成員變量描述的是這個類的一些屬性或狀態的,下面通過代碼來演示怎么定義成員變量。語法為:變量的類型變量的名稱。
【范例】創建成員變量的一般形式。
示例代碼
01//bike類描述的是一個自行車
02publicclassbike
03{
04//這個成員變量描述的是自行車的顏色.
05Stringcolor;
06
07//這個成員變量描述的是自行車的大小,即尺寸.
08Stringsize;
09}
在該程序中,定義了一個叫做bike的類,在該類中定義了兩個成員變量,一個是表示自行車顏色的color成員變量,一個是表示自行車型號的size成員變量。
下面看一個創建成員變量的完整形式。
代碼講解
通過new關鍵字來創建這個bike類的對象,用bike類的對象引用b來給其成員變量賦值。因為成員變量是在這個類實例化后才能訪問到的。成員變量賦完值后,調用println語句來打印并顯示結果。
6.3.2成員變量的初始化
通過new關鍵字來創建一個對象后,會有一個系統默認的初始值。所以說不管有沒有在創建成員變量的時候給變量一個值,系統都會有一個默認的值。
成員變量和對象的引用在申明的時候不對其賦初值,那么系統都會賦一個初值,具體的信息如表所示。
6.4局部變量
局部變量和成員變量很相似都是描述信息的。局部變量和成員變量的不同點就是局部變量是在方法體里創建的,在方法體外是訪問不到這個變量的。
6.4.1局部變量的創建和初始化
局部變量描述的是方法體的一些屬性或狀態的,下面通過代碼來演示怎么定義局部變量。創建局部變量的基本語法為:變量的類型變量的名稱。
【范例】演示局部變量的例子。
示例代碼
01//test類描述的是基本類型的初始化
02publicclasstest4
03{
04//程序的運行函數即主入口函數
05publicstaticvoidmain(Stringargs[])
06{
07//基本類型的局部變量
08intsize=123;
09booleanb=true;
10//打印并顯示局部變量
11System.out.println(size);
12System.out.println(b);
13}
14}
6.4.2局部變量和成員變量的區別
局部變量描述的是這個方法體內的屬性的,而成員變量描述的是這個對象里的屬性的,它們之間的區別,即訪問區別如下:
成員變量可以被public、protected、default、private、static、final修飾符修飾。
局部變量可以被final修飾符修飾,但不能修飾為public、protected、default、private、static。
成員變量是在堆里進行創建的,而局部變量是在棧里進行創建的。
成員變量是系統默認值。
局部變量沒有系統默認值,必須手動賦值。
6.5方法
每個人都有走、吃和睡等動作。在Java中,所謂方法就好比日常生活中的一個動作,是完成一系列操作的。在Java中也是如此,方法收到對象的信息,進行處理的操作。
6.5.1方法的創建和參數
方法的參數是提供外界在執行方法的時候提供給方法的特殊描述信息的,好比日常生活中的,用力砸東西,用大力砸東西。而這個用大力就是提供給這個進行特殊描述的。
創建方法的語法為:
方法修飾符方法的返回類型方法名稱(方法參數)
{
方法體
}
方法的定義如下所示。
publicvoidadd(inti,intn)
{
System.out.println(i+n);
}
代碼說明:
方法名稱為add,有兩個參數都是int類型的。
方法體是打印i+n的值,并顯示出來。
?、俜椒ǖ男揎椃麨閜ublic類型的,修飾符可有可無。
?、诜椒ǖ姆祷仡愋陀泻芏喾N,主要分為如下幾類。
③方法返回值為void類型時為無返回值。
?、芊椒ǚ祷刂颠€可以為任意的類型,如String、Boolean、int。如果定義了方法的返回類型就⑤必須在方法體內用return把返回值進行返回。
?、薹椒ǖ姆祷刂悼梢詾閚ull,但必須是對象類型。基本類型不能返回null。
?、咴诜祷刂禐榛绢愋偷臅r候,只要能夠自動轉換就可返回。
?、喾椒ǖ膮狄灿卸喾N形式,下面是對方法參數的討論。
?、岱椒ǖ膮悼梢詾榛緮祿愋停部梢詾閷ο笠妙愋?。
?、饷總€參數都有完整的聲明該變量的形式。
?方法的參數可以有一個,也可有多個。
?Java程序的入口main就為一個方法,參數為String[]args,它是個特殊的方法。
6.5.2方法參數的傳遞
參數的傳遞是傳遞的值還是引用呢。下面通過例子來分別說明,請仔細考慮。
【范例】當傳遞類型為基本類型時,傳遞的是該類型的值。
01//test類描述的是基本類型的傳遞
02publicclasstest
03{
04//方法add是把傳入的參數進行+1,并顯示其結果
05publicvoidadd(inti)
06{
07i=i+1;
08System.out.println(i);
09}
10
11//程序的運行方法,即主入口方法
12publicstaticvoidmain(Stringargs[])
13{
14//基本類型的局部變量
15intsize=44;
16
17//創建bike類的對象實例,即bike類的對象引用b
18testt=newtest();
19
20//打印原來的值
21System.out.println(size);
22//運行時的值
23t.add(size);
24//打印運行后的值
25System.out.println(size);
26}
27}
在參數為基本類型進行傳遞的時候,是傳遞的這個值的備份,即第二份。不論在方法中怎么改變這個備份,都不是操作原來的數據,所以原來的值是不會改變的。
當傳遞的參數為對象引用類型時,也是利用的傳值的方式進行的。
01//test類描述的是方法的傳遞
02publicclasstest
03{
04publicstaticvoidmain(String[]args)
05{
06//創建一個對象類型
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}
當把對象引用s傳遞到一個方法后,這個方法可以改變這個對象的屬性,并能返回相應的改變。但這個對象引用指向的這個字符串s是永遠不會改變的。這里傳遞對象引用后,又通過這個引用去創建了一個新的String類型的字符串,這兩個字符串在內存中當然不是同一個了。
6.6對象引用的使用
所謂對象引用就是該引用名稱指向內存中的一個對象,通過調用該引用即可完成對該對象的操作。本節將要討論一些操作對象引用中將出現的一些常見問題。如不存在的對象、空引用、對象間的比較等問題,下面分別來說明。
6.6.1調用不存在的對象或成員變量
如果調用的對象或成員變量沒有創建,那么在編譯的時候編譯器將出現錯誤。下面用代碼演示這個錯誤,并演示如何修正。
【范例】代碼演示訪問不存在的成員變量。
示例代碼
01//test類描述的是測試訪問不存在的成員變量
02publicclasstest
03{
04//main方法為程序的入口函數
05publicstaticvoidmain(String[]args)
06{
07//創建test類的對象實例
08testt=newtest();
09//t.a訪問的是一個不存在的成員變量,將提示不可識別的字段。
10System.out.println(t.a);
11}
12}
運行將會發生如下異常。
Exceptioninthread"main"java.lang.Error:Unresolvedcompilationproblem:
t.acannotberesolvedorisnotafield
attest.main(test.java:7)
【代碼解析】對象引用t要訪問的是a這個成員變量,而a沒有聲明,在編譯的時候將提示錯誤信息。在錯誤提示里,已經提示為main方法里的第7行,只需查看這里就能找到錯誤的所在。
修改上述代碼使程序運行通過。
01//test類描述的是測試訪問不存在的成員變量
02publicclasstest
03{
04//a為test類的成員變量
05Stringa;
06
07//main方法為程序的入口方法
08publicstaticvoidmain(String[]args)
09{
10//創建test類的對象實例
11testt=newtest();
12//t.a訪問的是一個不存在的成員變量,將提示不可識別的字段
13System.out.println(t.a);
14}
15}
根據上例中的錯誤提示在test類聲明了一個名稱為a的成員變量。因為String類型的a沒有進行賦值,所以打印出來為null。
6.6.2調用對象為null值的引用
任何操作的對象的值為null的時候都將出現空指針錯誤,即“NullPointException“錯誤,因為成員變量和方法是屬于對象的,即屬于用new關鍵字創建出來的對象的。下面用代碼來演示這個錯誤,并演示如何進行修正。
01//ArrayList類所需要的
02importjava.util.ArrayList;
03
04//test類測試訪問null值的對象
05publicclasstest
06{
07//聲明一個成員變量a并進行初值
08publicStringa="test類的成員變量";
09
10//Java程序的主入口方法
11publicstaticvoidmain(String[]args)
12{
13//創建test類的對象實例
14testt=newtest();
15
16//創建一個集合類,對象引用為一個null值
17ArrayListal=null;
18
19//向一個null的集合對象里添加數據
20al.add(t.a);
21}
22}
ArrayList類為一個集合類和數組很相似,都是用來存儲數據用的。錯誤提示在main方法里的20行,提示為NullPointerException,即空指針錯誤。對象引用al聲明為一個null值,表示這個對象并沒有創建其對象的實例,只是一個引用而已。當操作任意一個為null的對象的時候都將提示空指針錯誤。
6.6.3對象引用間的比較
兩個對象引用進行比較,比較的是這兩個對象的引用,而引用是在內存中的一個地址。地址當然是不能相同的了。下面通過一個例子來演示引用間的比較。
【范例】演示兩個對象引用的比較。
equals方法在這里比較的是對象的引用,因為equals方法是Object類的方法,而任何類的父類都為Object,equals方法是繼承過來的。繼承將在后面的章節里做詳細講解。用new關鍵字創建的對象地址是重新分配的,它們進行比較,地址當然是不同的了。
6.7this
this是Java保留的一個關鍵字,所謂this就好比日常生活中的“你我他”中的我,表示自己、本身的意思。在Java里也是如此,表示類的本身。
0基礎 0學費 15天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習