標籤:2.3 注意 一模一樣 方式 覆蓋 函數 避免 規範 多個
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();
}
//使用介面implements
class Test implements Inter
{
public void show(){} //需要重寫抽象方法show,才能建立對象
}
class InterfaceDemo
{
public static void main(String[] args)
{
Test 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--相關特性