java 基础---继承
繼承
一,概述
a)???????? 使用extends關(guān)鍵字可以讓一個類繼承另一個類,繼承的類為子類,被繼承的類是父類,子類會自動繼承父類的所有方法和屬性。
b)??????? 繼承使得類和類之間產(chǎn)生了關(guān)系
c)??????? 子類可以使用super調(diào)用父類成員
d)??????? 繼承的最終目的就是提高代碼的復(fù)用性。
e)???????? 當(dāng)發(fā)現(xiàn)一個類的功能不行時, 就可以派生子類增加方法。
什么時候定義繼承呢?
當(dāng)類與類之間有所屬( is? a )關(guān)系時,就會繼承。
一個類是一個另一個類中的一種。比如:蘋果是水果的一種。
?
繼承中子父類中成員的特點:
1,成員變量。
?????? 當(dāng)子父類出現(xiàn)同名變量時,可以使用super關(guān)鍵字區(qū)分。
?????? 一般這種情況很少見,因為父類已經(jīng)定義了,子類就沒有必要在定義了。
?????? 而且父類中的屬性都是私有的,子類也無法直接訪問。
?
?
2,成員函數(shù)。
?????? 當(dāng)子父類中出現(xiàn)一模一樣的函數(shù)時,就出現(xiàn)了覆蓋的操作。
?????? 所謂覆蓋,其實是子類對象在使用時,運行的是子類的函數(shù)。
?????? 好像父類的被覆蓋一樣。所以就形象成為函數(shù)的覆蓋,這是函數(shù)的另一個特性。
?
?????? 什么時候使用覆蓋呢?
?????? 當(dāng)父類的功能需要修改或者升級時,直接修改父類中的代碼,并不利于后期的擴展和維護。
?????? 可以定義一個子類對父類的功能進行覆蓋。
?????? 沿襲父類的功能定義,重寫功能的主體內(nèi)容。
?????? 這樣就提高擴展性和維護性。
?
?????? 手機的例子:來電顯示功能。
?
?????? 覆蓋的注意事項:
?????? 1,子類覆蓋父類必須權(quán)限大于等于父類的權(quán)限。
?????? 2,靜態(tài)只能覆蓋靜態(tài)。
3,構(gòu)造函數(shù)
?????? 子類的所有構(gòu)造函數(shù)默認(rèn)都會訪問父類中空參數(shù)的構(gòu)造函數(shù)。
?????? 因為子類的所有的構(gòu)造函數(shù)的默認(rèn)第一行都有一個隱式的語句,super();
?????? 為什么一定要調(diào)用父類構(gòu)造函數(shù)呢?
?????? 因為子類獲得父類中的數(shù)據(jù),需要父類先對數(shù)據(jù)進行初始化。
當(dāng)父類中沒有空參數(shù)的構(gòu)造函數(shù)時,子類就沒有辦法使用隱式的super();訪問父類中的構(gòu)造函數(shù),這時可通過手動用this或super語句來指定要訪問的構(gòu)造函數(shù)。
這就是子類實例化的過程。
?
this和super在用法上很相像,
?????? 可以使用這兩個關(guān)鍵字調(diào)用屬性,調(diào)用行為,區(qū)分同名屬性,區(qū)分同名行為。
?????? 可調(diào)用構(gòu)造函數(shù)。
但是有著本質(zhì)的區(qū)別:
?????? this指向的是一個本類對象。
?????? super并沒有指向一個對象,而僅僅代表父類的空間,應(yīng)該算是父類空間的一個標(biāo)識引用。
?
繼承的弊端:打破了封裝性。
解決方式可通過final關(guān)鍵字完成。
final關(guān)鍵字的出現(xiàn)其實是提高程序的嚴(yán)謹(jǐn),讓不允許改變的內(nèi)容固定下來。
特點:
1,? final修飾類,函數(shù),變量(類變量,實例變量,局部變量)
2,? final修飾的類不可被繼承。
3,? final修飾的方法不可被復(fù)寫。
4,? final修飾的變量是一個常量,只能被賦值一次。
?
對于參與運算不變的數(shù)據(jù),通常都會定義一個常量將該數(shù)據(jù)記錄下來。
目的是給該數(shù)值起一個名字,方便使用和閱讀。
常量定義規(guī)范:所有的字母都大寫,多個單詞用_相連。通常成員常量都是靜態(tài)的。
?
如何設(shè)計好繼承
1,? 把通用操作與方法放在父類中,因為一個父類可以有好幾個子類。如果是通用的操作,放在父類中,帶來的好處是多方面的,一是,避免代碼重復(fù),二,避免了人為因素導(dǎo)致的不一致。
2,? 不要使用受保護字段,也就是Pritected字段。
3,? 盡管類的繼承給開發(fā)帶來了好處和方便,但如果不希望自己的類在被擴展,也就不希望再產(chǎn)生子類時,可以在類的前面加上final。
?
?
?
?
向上轉(zhuǎn)型
當(dāng)用一個父類類型的變量在記錄子類對象時,子類對象會自動提升為父類的類型。
?
?
?
?
?
設(shè)計模式
?????? 解決某一類問題行之有效的方式;java中共有23種。是一種解決問題的思想。
單列模式
?????? 保證一個類在內(nèi)存中只有一個對象,也就保證了對象的唯一性。
?
什么時候要保證一個類中只有一個對象呢?
?????? 在java中只要建立對象就能獲取對象中的所有的方法和屬性。
思路:
1,? 不讓其他程序建立該類的對象。
2,? 在本類中建立一個本類對象。
3,? 將自定義的對象對外提供出去,讓其他程序訪問。
?
步驟,
1,? 將構(gòu)造函數(shù)私有化,不提供其他程序創(chuàng)建對象的初始化。
2,? new一個本類對象,私有并靜態(tài)。
3,? 定義一個公有的靜態(tài)方法返回該對象,讓其他程序可以調(diào)用。
?
餓漢式
?
public class SingleDemo {
??? private static SingleDemo s= new SingleDemo();
??? private SingleDemo(){}
??? public static SingleDemo getInstance()
??? {
?????? return s;
??? }
}
?
懶漢式;屬于對象的延遲加載,對于多線程并發(fā)訪問getInstance方法,會出現(xiàn)安全隱患。
class SingleDemo
{
??? private static SingleDemo s=null;
??? private SingleDemo(){}
??? public static SingleDemo getInstance()
??? {
?????? if(s==null)
?????????? s=new SingleDemo();
?????? return s;
??? }
}
?
優(yōu)化了安全問題????????????????????????? 我不懂的地方。
class SingleDemo {
??? private static SingleDemo s = null;
?
??? private SingleDemo() {
??? }
??? public static SingleDemo getInstance() {
?????? if (s == null) {
?????????? synchronized (SingleDemo.class) {
????????????? if (s == null)
????????????????? s = new SingleDemo();
?????????? }
?????? }
?????? return s;
??? }
}
?
模板設(shè)計模式
定義功能時,一部分功能是確定的,而一部分功能確定不了。確定的功能還要預(yù)先使用不確定的部分。
這時可將不確定部分對外暴露,由子類去實現(xiàn)。
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/liuhongliang1234/p/3430566.html
總結(jié)
以上是生活随笔為你收集整理的java 基础---继承的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 我留不住爱留不住情是什么歌呢?
- 下一篇: resin-pro-4.0.34 服務