---------------------- ASP.Net+Android+IOS開發、.Net培訓、期待與您交流! ----------------------
一.繼承(Extends)的意義(講解順序:屬性、函數、構造函數)
繼承的思想由來:當若干個類都存在共性的屬性或方法時,
* 例如不管大小中學生都有年齡、姓名的屬性和學習的方法,
* 這樣就可以把這個共性的東西抽取出來形成一個新的類,
* 大中小學生類只需要和這個新類有一定的關係即可
*
* 注意:1、判斷兩個類是否能夠繼承,在於判斷一個類是否能夠擁有另一個類的所有屬性和方法
* 2、如果不能繼承,可以尋找是否有相同的共性,然後向上抽取形成新類,這兩個類即可以繼承這個新類
* 3、java只支持單繼承,不支持多繼承;
* 因爲當多個父類定義了相同的功能時,並且功能內容不同時,子類不確定要調用哪一個
*
* java不支持多繼承,但是支持多層繼承,也就是一個繼承體系
* 注意:在多層繼承中,要想使用一個繼承體系的功能,先查閱父類的描述,因爲父類中定義的是該體系共性的功能,
* 最好的辦法就是創建子類的對象,因爲這樣既可以使用基本功能,還可以使用特有功能
* 爲什麼呢? 一,因爲父類可能無法創建對象;二,創建子類對象能夠使用更多的功能
*
代碼示例:
public class ExtendsDemo_Prorerty {
public static void main(String[] args) {
Zi z = new Zi();
/*對於繼承來說,這句話執行的時候內存地址發生了改變,
*在加載Zi類前會先加載Fu類,並且堆內存中會出現兩個name屬性,分屬不用區域塊。
*/
System.out.println(z.name);
z.show();
}
}
//父類
class Fu{
String name = "lisi";
}
//子類
class Zi extends Fu{
//String name = "zhangsan";
void show(){
//System.out.println(this.name); //調用本類中的name,this關鍵字,代表本類對象引用
//System.out.println(super.name); //調用父類中的name,super關鍵字,代表父類對象引用
System.out.println(name); //如果子類中沒有name屬性,那麼會調用父類中的name,這裏省略了(super.name)
}
}
二.繼承(函數講解)
* 繼承中子類和父類的方法(函數)變化
* 重寫(覆蓋):
* 1、當子類中出現和父類中一模一樣的函數時,子類對象調用此函數,會運行子類函數中的內容
* 2、父類中的私有方法不能夠被覆蓋
* 3、繼續使用被覆蓋的方法可以用(super.方法)
*
*
* 覆蓋注意事項:
* 1、子類要想覆蓋父類中的方法,權限一定要>=父類
* 2、靜態方法只能覆蓋靜態方法
*
*
* 重載與重寫的區別:
* 重載:只看函數參數列表是否一致
* 重寫:字符類方法要一模一樣,包括返回值類型
*
*
* 覆蓋的應用:當子類需要父類的功能,而功能主體又有自己的特有內容時,可以複寫父類中的方法,
* 這樣即沿襲了父類的功能,有定義了子類特有的功能
*
代碼示例:
public class ExtendsDemo_Method {
public static void main(String[] args) {
Zz z = new Zz();
z.show(); //例1
}
}
//父類
class Ff{
void show(){
System.out.println("fu show");
}
private void method(){ //例2
System.out.println("Zi show");
}
}
//子類
class Zz extends Ff{
void show(){
System.out.println("Zi show");
super.show(); //例3
}
}
三.繼承(講解構造函數)
* !創建子類對象時,會先調用父類構造函數
* 原因:子類的構造函數第一行隱藏了一句代碼super(),意思是調用父類構造函數
* 注意:1、子類所有的構造函數第一行都默認了super();
* 2、默認的super()是沒有參數的,就算父類中有參數的構造函數,也不回調用到
* 如果要調用到有參數的構造函數,必須手動創建
*
* 子類爲什麼要訪問父類的構造函數?
* :因爲子類在調用父類的數據時,首先要確定父類是否對這些數據進行了初始化
*
*
* 結論:
* 子類實例化過程(子類中的所有構造函數,默認在第一行訪問父類中的構造函數)
* 1、super()語句是定義在子類構造函數第一行,因爲要首先進行初始化
* 2、如果父類中沒有空參數的構造函數,那麼在子類構造函數中第一行需要自定義帶參數的構造函數
* 3、子類構造函數中的第一行也可以自定義this(參數)來訪問本類中其他的構造函數
* 因爲其他構造函數第一行也有super()語句
* 4、每一個類都有父類Object
*
代碼示例:
public class Extends_Constructor {
public static void main(String[] args) {
Z z = new Z();
}
}
//父類
class F{ //extends Object
//構造函數
F(){
System.out.println("F run");
F(String name){ //結論2
}
}
//子類
class Z extends F{
//構造函數
Z(){
//suoer{}; //結論1
System.out.println("Z run");
}
Z(String name){
//this(); //結論3
//super //結論1
System.out.println("Z speak");
}
}
四.final(最終的)
* final用來修飾類、函數、變量
* 1、final修飾的類是不能夠被繼承的
* 2、final修飾的函數是不能夠被複寫的,這樣保證了一個類中有的方法是不能夠被複寫的,而有的可以
* 3、final既可以修飾成員變量,又可以修飾局部變量,被final修飾的變量爲常量,
* 因爲一些值是不能被改變的,例如π=3.14
* 格式規範:常量名所有字母大寫,單詞間用_隔開
*
---------------------- ASP.Net+Android+IOS開發、.Net培訓、期待與您交流! ----------------------詳細請查看:http://edu.csdn.net