設計模式_繼承_類中成員_覆蓋_子類的實例化過程

----------- android培訓java培訓、java學習型技術博客、期待與您交流! ------------

【設計模式】

解決某一類問題最快且有效的方法。java中23種設計模式:

單例設計模式:解決一個類在內存只存在一個對象。
想要保證對象唯一。
1,爲了避免其他程序過多建立該類對象。先禁止其他程序建立該類對象
2,還爲了讓其他程序可以訪問到該類對象,只好在本類中,自定義一個對象。
3,爲了方便其他程序對自定義對象的訪問,可以對外提供一些訪問方式。
這三部怎麼用代碼體現呢?
1,將構造函數私有化。
2,在類中創建一個本類對象。
3,提供一個方法可以獲取到該對象。
對於事物該怎麼描述,還怎麼描述。
當需要將該事物的對象保證在內存中唯一時,就將以上的三步加上即可。
//Single類一進內存,就已經創建好了對象。先喫
class Single//開發用這個,它安全簡單
{
private static Single s = new Single();
private Single(){}
public static Single getInstance()
{
return s;
}

}


//對象是方法被調用時,才初始化,也叫做對象的延時加載。成爲:懶漢式。餓了在喫
//Single類進內存,對象還沒有存在,只有調用了getInstance方法時,才建立對象。
class Single 
{
private static Single s = null;//private final static Single s = null;
private Single(){}
public static Single getInstance()
{
if(s==null)//如果多個人同時來了就有問題了,所以同步加上了,但影響性能
{
synchronized(Single.class)
{
if(s==null){
s = new Single();
}
return s;
}

}

【繼承;extends】
提高了代碼的複用性,讓類與類之間產生了關係,有了這個關係纔有了多態的特性
繼承之間必須是類與類之間有所屬關係
先有父類:原因先有對象,分析完對象有了描述,再把描述往上一抽取形成父類,後續才慢慢有子類
Java語言中:java只支持單繼承,不支持多繼承。
因爲多繼承容易帶來安全隱患:當多個父類中定義了相同功能,
當功能內容不同時,子類對象不確定要運行哪一個。
但是java保留這種機制。並用另一種體現形式來完成表示。多實現。
java支持多層繼承。也就是一個繼承體系
如何使用一個繼承體系中的功能呢?
想要使用體系,先查閱體系父類的描述,因爲父類中定義的是該體系中共性功能。
通過了解共性功能,就可以知道該體系的基本功能。
那麼這個體系已經可以基本使用了。
那麼在具體調用時,要創建子類的對象,爲什麼呢?
一是因爲有可能父類不能創建對象,如抽象類、接口
二是創建子類對象可以使用更多的功能,包括基本的也包括特有的。
簡單一句話:查閱父類功能,創建子類對象使用功能。
事物與事物之間或類與類之間關係:繼承、聚集(分爲聚合與組合),用緊密關係來區分
誰是誰的一種稱爲繼承
【類中成員】
1,變量。
2,函數。
3,構造函數。
1,變量
如果子類中出現非私有的同名成員變量時,
子類要訪問本類中的變量,用this
子類要訪問父類中的同名變量,用super。
super的使用和this的使用幾乎一致。
this代表的是本類對象的引用。
super代表的是父類對象的引用。
子父類中的函數。
當子類出現和父類一模一樣的函數時,
當子類對象調用該函數,會運行子類函數的內容。
如同父類的函數被覆蓋一樣。
這種情況是函數的另一個特性:重寫(覆蓋)
當子類繼承父類,沿襲了父類的功能,到子類中,
但是子類雖具備該功能,但是功能的內容卻和父類不一致,
這時,沒有必要定義新功能,而是使用覆蓋特性,保留父類的功能定義,並重寫功能內容。
注意重寫功能內容要把父類的實現也加其中(看情況而定):super.show();
【覆蓋】
1,子類覆蓋父類,必須保證子類權限大於等於父類權限,纔可以覆蓋,否則編譯失敗。
2,靜態只能覆蓋靜態。
記住:
重載:只看同名函數的參數列表。
重寫:子父類方法要一模一樣。
子父類中的構造函數。
在對子類對象進行初始化時,父類的構造函數也會運行,
那是因爲子類的構造函數默認第一行有一條隱式的語句 super();
super():會訪問父類中空參數的構造函數。而且子類中所有的構造函數默認第一行都是super();
爲什麼子類一定要訪問父類中的構造函數。
因爲父類中的數據子類可以直接獲取。所以子類對象在建立時,需要先查看父類是如何對這些數據進行初始化的。
所以子類在對象初始化時,要先訪問一下父類中的構造函數。
如果要訪問父類中指定的構造函數,可以通過手動定義super語句的方式來指定。
注意:super語句一定定義在子類構造函數的第一行。調用父類構造super(參數...);調用父類方法用super.show();
this和super語都要放在構造函數的第一行,因爲初始化動作要先做,所以只能出現一個;下面這樣寫就可以了
class Zi extends Fu
{
Zi()
{
//this(6);//這塊總不會這樣寫吧,嚇人,所以原因想想就明白了
super();  
System.out.println("zi run");
}
Zi(int x)
{
this();//如果this不是調用構造可以放在super下一行
System.out.println("zi..."+x);
}
}
【子類的實例化過程】
結論:
子類的所有的構造函數,默認都會訪問父類中空參數的構造函數。
因爲子類每一個構造函數內的第一行都有一句隱式super();
當父類中沒有空參數的構造函數時,子類必須手動通過super語句形式來指定要訪問父類中的構造函數。
當然:子類的構造函數第一行也可以手動指定this語句來訪問本類中的構造函數。
子類中至少會有一個構造函數會訪問父類中的構造函數。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章