1.繼承(關鍵字:extends):(子父類別)
1.提高程式碼的複用性。
2.讓類別與類別之間產生了關係。有了這個關係,才有了多態的特性。
1.1變數
如果子父類別中出現非私有的(private)同名成員變數時,子類別要存取本類別中的變量,用this,子類別要存取父類別中的同名變量,用super。
super的使用和this使用幾乎一致。
this代表的是本類別物件的參考。
super代表的父類別物件的參考。
1.2 子父類別中的函數
當子類別出現和父類別一模一樣的函數時,
當子類別物件呼叫函數,就會執行子類別函數的內容。如同父類別的函數被覆蓋一樣。
這種情況是函數的另一個特性:重寫(覆蓋)
當子類繼承父類,沿襲了父類的功能,到子類中,但是子類雖具備該功能,但是功能的內容卻和父類不一致,這時,沒有必要定義新功能,而是使用覆蓋特性,保留父類的功能定義,並重寫功能內容。
覆寫注意事項:
1.子類別覆寫父類,必須保證子類別權限大於等於父類權限,才可以覆寫,否則編譯失敗。 (不寫權限修飾符則是預設權限,介於private和public之間。)
2.靜態只能覆寫靜態。
重載與重寫:
重載:只看同名函數的參數清單。
重寫:子父類別中的方法名稱和傳回型別要一模一樣。 (即:傳回型別 方法名稱() 要一樣)
#1.3 子類別中的建構子。
在對子類別物件進行初始化時,父類別的建構子也會運行,那是因為子類別的建構子預設第一行有一條隱式的語句super();
為什麼子類別一定要存取父類別中的建構子。
因為父類別中的資料子類別可以直接取得,所有子類別物件在建立時,需要先查看父類別是如何對資料進行初始化的。所以子類別在物件初始化時,要先存取一下父類別中的建構子。如果要存取父類別中指定的建構函數,可以透過手動定義super語句的方式來指定。
注意:super語句一定要定義在子類別建構子的第一行。
結論:
子類別的所有的建構函數,預設都會存取父類別中空參數的建構子。
因為子類別每一個建構子內的第一行都會有一句隱式super();
當父類別中沒有空參數的建構子時,子類別必須手動透過super語句形式來指定要存取父類別中的建構子。
當然:子類別的建構子第一行也可以手動指定this語句來存取本類別中的建構子。子類別中至少會有一個建構函式會存取父類別中的建構子。 (因為this()和super()都只能放在建構子的第一行,所以在建構函式中只能存在其中一個。)
注意:千萬不要為了取得其他類別的功能,簡化程式碼而繼承。必須是類別與類別之間有所屬關係才可以繼承。所屬關係 is a 。
2.final:最終。作為一個修飾符。
2.1 可以修飾類,函數,變數。
2.2 被final修飾的類別不可以被繼承。為了避免被繼承,避免被子類別重寫功能。
2.3 被final修飾的方法不能被重寫
2.4 被final修飾的變數是常數只能賦值一次,既可以修飾成員變量,也可以修飾局部變數。當描述事物時,一些資料的出現,值是固定的,那麼這時為了增強閱讀性,都會給這些值取個名字。方便閱讀。而這個值不需要改變,所以加上final修飾。 作為常數:常數的書寫規範所有字母都大寫,如果由多個單字組成。字間通過_連接。 (eg: final double PI = 3.14; final int SET_ON = 1;)
2.5 內部類別定義在類別中的局部位置上時,只能存取該局部被final修飾的局部變數。
3. 抽象:
3.1 抽象方法一定在抽象類別中。
3.2抽象方法和抽象類別都必須被 abstract關鍵字修飾。 (abstract class 類別名稱 { abstract void 方法名稱(); })
3.3抽象類別不可以用new建立物件。因為呼叫抽象方法沒意義。
3.4 抽象類別中的抽象方法要被使用,必須由子類別重寫其所有的抽象方法後,建立子類別物件呼叫。如果子類別只覆寫了部分抽象方法,那麼該子類別還是一個抽象類別。
一般類別和抽象類別的異同:抽象類別和一般類別沒有太大的不同。該如何描述事物,就如何描述事物,只不過,該事物出現了一些看不懂的東西。這些不確定的部分,也是該事物的功能,需要明確出現。但是無法定義主體。透過抽象方法來表示。
抽象類別比一般類別多了個抽象函數。就是在類別中可以定義抽象方法。
抽象類別不可以實例法。
特殊:抽象類別中可以不定義抽象方法,這樣做只是不讓該類別建立物件。
4. 模版設計模式:
在定義功能時,功能的一部分是確定的,但是有一部分是不確定,而確定的部分在使用不確定的部分,那麼這時就將不確定的部分暴露出去。由該類別的子類別去完成。
5.介面:
初期理解,可以認為是一個特殊的抽象類別。當抽象類別中的方法都是抽象的(abstract),那麼該類別可以透過介面的形式來表示。
class :用來定義類別
interface:用來定義介面。介面也是一種類別。可以產生class檔案。
介面定義時,格式特性:
1.介面中常見定義:常數,抽象方法。介面的出現將「多重繼承」透過另一種形式體現出來,即「多重實現」。
2.介面中的成員都有固定修飾符。
常數:public static final
方法:public abstract
記住:介面中的成員都是public的。
介面:是不可以建立物件的,因為有抽象方法(abstract)。需要被子類別實現,子類別對介面中的抽象方法全都重寫後,子類別才可以實例化。否則子類別是一個抽象類別。
eg: interface Inter
{
//public static final 和public abstract修飾符缺少也可以,因為介面中的成員都有固定修飾符。但是開發中最好寫,增強閱讀性。
public static final int SET_ON = 1;
public abstract void show();
}
////使用介面使用介面卡 鐵> public void show (){} //需要重寫抽象方法show,才能建立物件
}
class InterfaceDemo
{
public static void main(String[] args)# public static v t = new Test();
System.out.println(t.SET_ON);
}
}
##」介面的特徵:
對外暴露的規則。介面是程式的功能擴充。
介面可以用來多實作。 類別與介面之間是實作關係,而且類別可以繼承一個類別的同時實作多個介面。
介面與介面之間可以有繼承關係。
6.多態:
定義:某一類事物的多種存在形態。
eg:動物中貓、狗
貓這個物件對應的類型是貓類型
貓x = new 貓();
同時貓也是動物中的一種,也可以把貓稱為動物。
動物 y = new 貓();
動物是貓和狗具體事物中抽取出來的父類型。
父類型參考指向了子類型物件。
6.1.多態的體現:
父類別的參考指向了自己的子類別物件。
父類別的參考也可以接收自己的子類別物件。
eg: 父類別 父類別引用名稱 = new 子類別();//類型提升。向上轉型。要使用子類別特有功能,需要向下轉型:子類別 新子類別參考名稱= (子類別)原父類別引用名稱
關鍵字: instanceof 判斷參考類型
eg: if (a instanceof Cat) //判斷a是不是貓型。
6.2.多態的前提:
必須是類別與類別之間有關係。要么繼承,要么實現。
通常還有一個前提:子類別必須覆寫(重寫)。
6.3.多態的好處:
多態的出現大大的提高了程式的擴展性。
6.4.多態的弊端:
6.5在多態中非靜態成員函數的特點:
在編譯期間:參閱引用型變數所屬的類別中是否有呼叫的方法。如果有,編譯通過,如果沒有,編譯失敗。
在運行時期:參考物件所屬的類別中是否有呼叫的方法。
簡單總結就是:成員函數在多型呼叫時,編譯看左邊,運行看右邊。
6.6在多態中成員變數的特性:
無論編譯和執行,都參考左邊(引用型變數所屬的類別。)
在多態中靜態成員函數的特性:
無論編譯和運行,都參考左邊(static本身就可以直接呼叫)。
7.object:是所有物件的直接或間接父類,傳說中的上帝。
該類別中定義的肯定是所有物件都具備的功能。
內部類別的存取規則:
1.內部類別可以直接存取外部類別中的成員,包括私有。
2.外部類別要存取內部類別,必須建立內部類別物件。
以上是Java特性總結的詳細內容。更多資訊請關注PHP中文網其他相關文章!