Java--相關特性
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--相關特性