1. 程式人生 > >物件的三大特性

物件的三大特性

繼 承(面向物件特徵之一)
好處:
1:提高了程式碼的複用性。

2:讓類與類之間產生了關係,提供了另一個特徵多型的前提。

繼承的一個弊端:打破了封裝性。對於一些類,或者類中功能,是需要被繼承,或者複寫的。
這時如何解決問題呢?介紹一個關鍵字, final : 最終。
final 特點
1:這個關鍵字是一個修飾符,可以修飾類,方法,變數。
2:被 final 修飾的類是一個最終類,不可以被繼承。
3:被 final 修飾的方法是一個最終方法,不可以被覆蓋。
4:被 final 修飾的變數是一個常量,只能賦值一次。

抽象類 : abstract
抽象:不具體,看不明白。抽象類表象體現。
在不斷抽取過程中,將共性內容中的方法宣告抽取,但是方法不一樣, 沒有抽取,這時抽取到


的方法,並不具體,需要被指定關鍵字 abstract 所標示,宣告為抽象方法。
抽象方法所在類一定要標示為抽象類,也就是說該類需要被 abstract 關鍵字所修飾。
抽象類的特點:
1:抽象方法只能定義在抽象類中,抽象類和抽象方法必須由 abstract 關鍵字修飾(可以描
述類和方法,不可以描述變數) 。
2:抽象方法只定義方法宣告,並不定義方法實現。
3:抽象類不可以被建立物件 ( 例項化 )。
4:只有通過子類繼承抽象類並覆蓋了抽象類中的 所有 抽象方法後,該子類才可以例項化。否
則,該子類還是一個抽象類。
抽象類的細節:
1:抽象類中是否有建構函式?有,用於給子類物件進行初始化。
2:抽象類中是否可以定義非抽象方法?

可以。其實,抽象類和一般類沒有太大的區別, 都是在描述事物, 只不過抽象類在描述事物時,
有些功能不具體。所以抽象類和一般類在定義上, 都是需要定義屬性和行為的。只不過,比一般類
多了一個抽象函式。而且比一般類少了一個建立物件的部分。
3:抽象關鍵字 abstract 和哪些不可以共存? final ,  private , static
4:抽象類中可不可以不定義抽象方法?可以。抽象方法目的僅僅為了不讓該類建立物件

接 口:interface
1:是用關鍵字 interface 定義的。
2:介面中包含的成員,最常見的有全域性常量、抽象方法。
注意:介面中的成員都有固定的修飾符。
成員變數: public static final


成員方法: public abstract
interface Inter{
public static final int x = 3;
public abstract void show();
}
3:介面中有抽象方法, 說明介面不可以例項化 。介面的子類必須實現了介面中所有的抽象方法後,
該子類才可以例項化。否則,該子類還是一個抽象類。
4:類與類之間存在著繼承關係,類與介面中間存在的是 實現關係。
繼承用 extends ;實現用 implements ;
5:介面和類不一樣的地方,就是, 介面可以被多實現 ,這就是多繼承改良後的結果。 java 將多繼
承機制通過多現實來體現。
6:一個類在繼承另一個類的同時, 還可以實現多個介面。 所以介面的出現避免了單繼承的侷限性 。
還可以將類進行功能的擴充套件。
7:其實 java 中是有多繼承的。介面與介面之間存在著繼承關係, 介面可以多繼承介面 。
介面都用於設計上,設計上的特點: (可以理解主機板上提供的介面)
1:介面是對外提供的規則。
2:介面是功能的擴充套件。
3:介面的出現降低了耦合性

抽象類與介面:
抽象類: 一般用於描述一個體系單元,將一組共性內容進行抽取,特點:可以在類中定義抽象內容
讓子類實現,可以定義非抽象內容讓子類直接使用。它裡面定義的都是一些體系中的 基本內容 。
介面: 一般用於定義物件的 擴充套件功能 ,是在繼承之外還需這個物件具備的一些功能。
抽象類和介面的共性: 都是不斷向上抽取的結果。
抽象類和介面的區別:
1:抽象類只能被繼承,而且只能單繼承。
介面需要被實現,而且可以多實現。
2:抽象類中可以定義非抽象方法,子類可以直接繼承使用。
介面中都是抽象方法,需要子類去實現。
3:抽象類使用的是 is a  關係。
介面使用的 like a  關係。
4:抽象類的成員修飾符可以自定義。
介面中的成員修飾符是固定的。全都是 public 的

多 態(面向物件特徵之一) :函式本身就具備多型性,某一種事物有不同的具體的體
現。
體現: 父類引用或者介面的引用指向了自己的子類物件。 // Animal a = new Cat(); 父類可以呼叫
子類中覆寫過的(父類中有的方法)
多型的好處: 提高了程式的擴充套件性。繼承的父類或介面一般是類庫中的東西, (如果要修改某個方
法的具體實現方式)只有通過子類去覆寫要改變的某一個方法,這樣在通過將父類的應用指向子
類的例項去呼叫覆寫過的方法就行了!
多型的弊端: 當父類引用指向子類物件時,雖然提高了擴充套件性,但是隻能訪問父類中具備的方法,
不可以訪問子類中特有的方法。 (前期不能使用後期產生的功能,即訪問的侷限性 )
多型的前提:
1:必須要有關係,比如繼承、或者實現。
2:通常會有覆蓋操作。
多型的出現思想上也做著變化: 以前是建立物件並指揮物件做事情。有了多型以後,我們可以找
到物件的共性型別, 直接操作共性型別做事情即可, 這樣可以指揮一批物件做事情, 即通過操作父
類或介面實現。

多型在子父類中的成員上的體現的特點:
1,成員變數: 在多型中,子父類成員變數同名。
在編譯時期:參考的是 引用型變數所屬的類 中是否有呼叫的成員。(編譯時不產生物件,只檢
查語法錯誤 )
執行時期:也是參考 引用型變數所屬的類 中是否有呼叫的成員。
簡單一句話:無論編譯和執行,成員變數參考的都是引用變數所屬的類中的成員變數。
再說的更容易記憶一些: 成員變數 --- 編譯執行都看 = 左邊。
2,成員函式。
編譯時期:參考引用型變數所屬的類中是否有呼叫的方法。
執行事情:參考的是物件所屬的類中是否有呼叫的方法。
為什麼是這樣的呢? 因為在子父類中,對於一模一樣的成員函式,有一個特性:覆蓋。
簡單一句:成員函式,編譯看引用型變數所屬的類,執行看物件所屬的類。
更簡單:成員函式 ---  編譯看 = 左邊,執行看 = 右邊。
3,靜態函式。
編譯時期:參考的是引用型變數所屬的類中是否有呼叫的成員。
執行時期:也是參考引用型變數所屬的類中是否有呼叫的成員。
為什麼是這樣的呢? 因為靜態方法,其實不所屬於物件,而是所屬於該方法所在的類。
呼叫靜態的方法引用是哪個類的引用呼叫的就是哪個類中的靜態方法。
簡單說:靜態函式 ---  編譯執行都看 = 左邊