黑馬程序員----java面向對象02(繼承、final)

---------------------- 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

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章