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