首先先簡單的說一下其3大特性的定義:
封裝:隱藏對象的屬性和實現細節,僅對外公開接口,控制在程序中屬性的讀和修改的訪問級別。將抽象得到的數據和行為(或功能)相結合,形成一個有機的整體,也就是將數據與操作數據的源代碼進行有機的結合,形成“類”,其中數據和函數都是類的成員。封裝的目的是增強安全性和簡化編程,使用者不必了解具體的實現細節,而只是要通過外部接口,一特定的訪問權限來使用類的成員。封裝的基本要求是: 把所有的屬性私有化,對每個屬性提供getter和setter方法,如果有一個帶參的構造函數的話,那一定要寫一個不帶參的構造函數。在開發的時候經常要對已經編寫的類進行測試,所以在有的時候還有重寫toString方法,但這不是必須的。
繼承:通過繼承實現代碼復用。Java中所有的類都是通過直接或間接地繼承java.lang.Object類得到的。繼承而得到的類稱為子類,被繼承的類稱為父類。子類不能繼承父類中訪問權限為private的成員變量和方法。子類可以重寫父類的方法,及命名與父類同名的成員變量。但Java不支持多重繼承,即一個類從多個超類派生的能力。在開發中盡量減少繼承關系,這樣做是為了把程序的耦合度降低。
多態:多態又分為設計時多態和運行時多態,例如重載又被稱為設計時多態,而對于覆蓋或繼承的方法,JAVA運行時系統根據調用該方法的實例的類型來決定選擇調用哪個方法則被稱為運行時多態。總而言之,面向對象的設計的典型特點就是繼承,封裝和多態,這些特點也是面向對象之所以能如此盛行的關鍵所在。
封裝
java中類的屬性的訪問權限默認值不是private,要想隱藏該屬性的方法,就可以加private修飾符,來限制只能夠在類的內部進行訪問。
對于類中的私有屬性,要對其給出一對方法(getXXX,setXXX())訪問私有屬性,保證對私有屬性的操作和安全性。
方法的封裝,該公開的公開,該隱藏的隱藏。
java的繼承
繼承,是對有著共同特性的多類事物,進行再抽象成一個類。
java中的繼承要使用extends關鍵字,并且java中指允許單繼承,也就是一個類只能有一個父類。
構造方法不能被繼承。
java方法中的覆蓋
子類中有和父類中可訪問的同名同返回同參數列表的方法時,就會覆蓋從父類繼承來的方法。
super()關鍵字
super(),表示在子類的構造方法調用父類的構造方法時,super()也只能在構造方法中的第一句。
java中的多態
有兩種多態的機制:編譯時多態、運行時多態
1、方法的重載:重載是指同一類中有多個同名的方法,但這些方法有著不同的參數。,因此在編譯時就可以確定到底調用哪個方法,它是一種編譯時多態。
2、方法的覆蓋:子類可以覆蓋父類的方法,因此同樣的方法會在父類中與子類中有著不同的表現形式。在java語言中,基類的引用變量不僅可以指向基類的實例對象,也可以指向子類的實例對象,同樣,接口中的引用變量也可以指向其實現類的實例對象。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
public class A { public String show(D obj) { return ( "A and D" ); } public String show(A obj) { return ( "A and A" ); } } public class B extends A{ public String show(B obj){ return ( "B and B" ); } public String show(A obj){ return ( "B and A" ); } } public class C extends B{ } public class D extends B{ } public class Test { public static void main(String[] args) { A a1 = new A(); A a2 = new B(); B b = new B(); C c = new C(); D d = new D(); System.out.println( "1--" + a1.show(b)); System.out.println( "2--" + a1.show(c)); System.out.println( "3--" + a1.show(d)); System.out.println( "4--" + a2.show(b)); System.out.println( "5--" + a2.show(c)); System.out.println( "6--" + a2.show(d)); System.out.println( "7--" + b.show(b)); System.out.println( "8--" + b.show(c)); System.out.println( "9--" + b.show(d)); } } 1 --A and A 2 --A and A 3 --A and D 4 --B and A 5 --B and A 6 --A and D 7 --B and B 8 --B and B 9 --A and D |
當超類對象引用變量引用子類對象時,被引用對象的類型而不是引用變量的類型決定了調用誰的成員方法,但是這個被調用的方法必須是在超類中定義過的,也就是說被子類覆蓋的方法。
這我們用一個例子來說明這句話所代表的含義:a2.show(b);
這里a2是引用變量,為A類型,它引用的是B對象,因此按照上面那句話的意思是說有B來決定調用誰的方法,所以a2.show(b)應該要調用B中的show(B obj),產生的結果應該是“B and B”,但是為什么會與前面的運行結果產生差異呢?這里我們忽略了后面那句話“但是這兒被調用的方法必須是在超類中定義過的”,那么show(B obj)在A類中存在嗎?根本就不存在!所以這句話在這里不適用?那么難道是這句話錯誤了?非也!其實這句話還隱含這這句話:它仍然要按照繼承鏈中調用方法的優先級來確認。所以它才會在A類中找到show(A obj),同時由于B重寫了該方法所以才會調用B類中的方法,否則就會調用A類中的方法。
以上所述是小編給大家介紹的Java封裝、繼承、多態三大特征的理解,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對服務器之家網站的支持!