04_Java面向对象特征之继承与多态
1. 繼承
? ? ?Java繼承的實現(只支持單繼承,而不是多繼承,但有接口的多實現)? ? ? ? ?
多個類中存在相同屬性和行為時,將這些內容抽取到單獨一個類. 定義類時直接通過extends關鍵字指明要繼承的父類.子類對象除了可以訪問子類中直接定義的成員外,也可訪問父類的所有非私有成員.能否直接訪問父類私有成員則取決于訪問權限設置.
繼承的作用:(注意:不要僅為了獲取其他類中某個功能而去繼承,??類與類之間要有所屬( " is a " )關系)
繼承提高了代碼的復用性。
繼承的出現讓類與類之間產生了關系,提供了多態的前提。
如何使用一個繼承體系中的功能:
查閱父類功能(定義了共性的功能)
創建子類對象使用功能(因為父類可能不能創建對象, 而且子類提供了更豐富的功能)
?繼承中自子類變量的特點:
如果子類出現非私有的同名變量時, 子類訪問本類變量用this, 子類訪問父類中的同名變量用super.?
? ?繼承中函數的特點:
函數覆蓋(Override)
?子類中出現與父類一模一樣的方法時,會出現覆蓋操作,也稱為重寫或者復寫。
?父類中的私有方法不可以被覆蓋。
?在子類覆蓋方法中,繼續使用被覆蓋的方法可以通過super.函數名獲取。
?覆蓋注意事項:
? 覆蓋時,子類方法權限一定要大于等于父類方法權限
? 靜態只能覆蓋靜態。
?覆蓋的應用:
? 當子類需要父類的功能,而功能主體子類有自己特有內容時,可以復寫父類中的方法,這樣,即沿襲了父類的功能,又定義了子類特有的內
? ? ?構造方法在類繼承中的作用
? ? ? ? ? 構造方法不能繼承.由于子類對象要對來自父類的成員進行初始化,因此,在創建子類對象時除了執行子類的構造方法外,還需要調用父類的構造方法.具體遵循如下原則:
? ? ? ? ??(1) 當子類未定義構造方法時,創建對象時將無條件地調用父類的空構造方法,以為每行第一條super();?
? ? ? ? ? (2) 對于父類的含參數構造方法,子類可以在自己構造方法中使用關鍵字super來調用它,但super調用語句必須是子類構造方法中的第一個可執行語句;?
? ? ? ? ? (3) 子類在自己定義構造方法中如果沒有用super明確調用父類的構造方法,則在創建對象時,將自動先執行父類的無參構造方法,然后再執行自己定義的構造方法。?
? ? ? ? ? 所以在一個類的設計時如果有構造方法,最好提供一個無參構造方法.因此,系統類庫中的類大多提供了無參構造方法,用戶編程時最好也要養成此習慣.
? ? ?【注意】使用this查找匹配的方法時首先在本類查找,找不到時再到其父類和祖先類查找;使用 super 查找匹配方法時,首先到直接父類查找,如果不存在,則繼續到其祖先類逐級往高層查找。
?2. final修飾符的使用?
? ? ?1.final作為類修飾符: 這種類成為最終類,特點是不允許繼承.例如Api中的Math,String,Integer類都是final類.?
? ? ?2.final修飾方法:?是功能和內部語句不能被更改的最終方法,在子類中不能再對父類的final方法重定義.所有private修飾的為私有方法和final類中的方法都默認為是final.?
? ? ?3.final定義常量:只能被賦值一次 例如 final double PI=3.14159;?
? ? ? //注意帶static的類常量只能在定義或靜態代碼塊中賦值?
?4.內部類只能訪問被final修飾的局部變量。?
?3.?抽象類和抽象方法?
? ? ?1.抽象類的定義:抽象類代表了一種優化了的概念組織方式,來描述事物的一般狀態和行為,然后在子類中去實現這些狀態和行為,以適應對象的多樣性.?
? ? ?abstract?class 類名稱{?
? ? ? ? ??成員變量;??
? ? ? ? ? 方法(){……} ? ? ? //一般方法,可存在,可也不存在?
? ? ? ? ??abstract?方法();??//抽象方法 ? ? ? ? ???
? ? ?}?
說明:抽象類中可以包含具體方法和抽象方法,抽象方法的定義與具體方法不同,抽象方法在后直接跟分號,而具體方法都含有方法體.?
? ? ? //普通類加上abstract關鍵字就變成了抽象類,沒有任何條件限制.但是有抽象方法的類必須定義為抽象類,否則會提示"The type XXX must be an abstract class to define abstract methods"?
? ? ?2. 抽象方法表示一個抽象的概念,不能被實例化為對象.?
?3.抽象類中是有默認的構造函數.我的理解是不過隱藏了不能直接建立對象罷了.當然自己也可以寫自己的構造函數.??抽象類中的構造方法供子類實例化調用。?
?抽象關鍵字abstract不可以和哪些關鍵字共存??
private? 私有內容子類繼承不到,所以,不能重寫。
? ? ? ? ? ? ? ? ? ? ? ?但是,abstract修飾的方法,要求被重寫。兩者沖突。
? ? ? ? ? ?final
? ? ? ? ? ? ? ? ? ? ? ?final修飾的方法不能被重寫。
? ? ? ? ? ? ? ? ? ? ? ?而abstract修飾的方法,要求被重寫。兩者沖突。? ? ? ? ? ? ? ? ? ? ? ??
? ? ? ? ? ?static
? ? ? ? ? ? ? ? ? ? ? ? 假如一個抽象方法能通過static修飾,那么這個方法,就可以直接通過類名調用。
? ? ? ? ? ? ? ? ? ? ? ? 而抽象方法是沒有方法體的,這樣的調用無意義。所以,不能用static修飾。?
牽扯到的模版方法設計模式?
在定義功能時,功能的一部分是確定的,但是有一部分是不確定的.就將不確定的部分暴露出去,有該類的子類去完成.?
?4. 接口??
? ? ?Java中不支持多繼承,而是通過接口實現比多重繼承更強的功能,java通過接口可以使出于不同層次,甚至不相關的類具有相同的行為.可認為是一種特殊的抽象類.?
?? ? ?1.接口的定義:由常量和抽象方法組成??
? ? ? ? ??[public] interface 接口名 [extends 父接口名列表 ] ?{ ??
? ? ? ? ? ? ? [public] [static] [final] 域類型 域名 = 常量值 ; ??
? ? ? ? ? ? ? [public] [abstract] 返回值 方法名(參數列表) [throw 異常列表];??
? ? ? ? ? } ? ???
? ? ? ? ? ? ? ?[1]聲明接口可給出訪問控制符; ??
? ? ? ? ? ? ? ?[2]一個接口還可以繼承多個父接口,父接口間用逗號分隔。 ??
? ? ? ? ? ? ? ?[3]系統默認接口中所有屬性的修飾都是public static final,畢老師說的全局常量. ??
? ? ? ? ? ? ? ?[4]系統默認接口中所有方法的修飾都是public abstract;即抽象方法.??
? ? ?接口是抽象類的一種,不能用于直接創建對象.接口的作用在于規定一些功能框架,具體功能的實現則通過該接口約束的類完成. ? ??
? 2.接口的實現?
? ? ? ? ?接口定義了一套行為規范,一個類實現這個接口就是要遵守接口的定義規范,要實現接口中定義的所有方法.?
? ? ? ? ?一個類可以實現多個接口。接口間用逗號分隔;??
? ? ? ? ?如果實現某接口的類不是抽象類,則在類的定義部分必須實現指定接口的所有抽象方法;否則編譯時會指示該類只能為抽象類是不能創建對象的. ??
? ? ? ? ?接口的抽象方法的訪問限制符默認為 public,在實現時要在方法頭中顯式地加上public修飾。??
5. 多態性(體現在父類或者接口的引用指向或者接收自己的子類對象)?
?作用:
多態的存在提高了程序的擴展性和后期可維護性.但弊端是父類的引用只能訪問父類中的成員.
?前提:
? 需要存在繼承或者實現關系
? 要有覆蓋操作
?? ? ?1.方法的重載
? ? ? ? ??方法調用的匹配處理原則是,首先按“精確匹配”原則去查找匹配方法,如果找不到,則按“自動類型轉換匹配”原則去查找能匹配的方法。
? ? ? ? ? 所謂“精確匹配”就是實參和形參類型完全一致。
? ? ? ? ? 所謂“自動轉換匹配”是指雖然實參和形參類型不同,但能將實參的數據按自動轉換原則賦值給形參。? ? ?
? ? ?2.方法的覆蓋
? ? ? ? ???方法名、參數列表、完全相同才會產生方法覆蓋;返回類型通常也要一致,只有返回類型為引用類型時,允許子類方法的返回類型是父類方法返回類型的子類型。其他情形導致類型不一致時編譯將指示錯誤。
? ? ? ? ? 覆蓋不能改變方法的靜態與非靜態屬性。子類中不能將父類非靜態方法定義為靜態方法,反之也一樣。?
? ? ? ? ? 不允許子類方法的訪問修飾符比父類有更多的限制。例如:子類不能將父類的public方法定義為protected方法。但可以將父類的private方法在子類中重新定義為public方法.通常將子類方法訪問修飾符與父類保持一致.
? ? ? ? ? final方法不能被覆蓋。
? ? ? ? ? [注意]?如果子類中定義了與父類同名的屬性,在子類中將隱藏來自父類的同名屬性變量.?對象執行方法時由實際對象的類型決定,而不是引用變量類型 ;
?訪問屬性時則由引用類型決定,因為編譯程序在分析程序時是基于類型來決定訪問哪個屬性變量 ;
?靜態成員的訪問是基于引用類型,而不是對象類型.
? ? ?3.訪問繼承的成員
? ? ? ? ? 得知通過子類對象賦值給父類的引用變量后,通過該引用變量去訪問對象的成員時,訪問的行為方法是子類對象的,而屬性值確是父類的.其實就是編譯系統是基于類型來決定的.
? ? ? ? ??是基于引用類型/實際對象?
? ? ? ? ?? 當子類和父類有相同成員時,通過子類引用訪問的成員都是子類定義的,而通過父類引用變量操作子類對象時,只有實例方法存在覆蓋關系(編譯時看左邊:要查看引用變量所屬的類中是否有所調用的成員。在運行看右邊:要查看對象所屬的類中是否有所調用的成員),而對象屬性,靜態屬性,靜態方法均是父類定義的.
? ? ?4.幾個特殊類
? ? ? ? ? ?Object類:?所有Java類的最終祖先,編譯系統默認繼承Object類,Object類包含了所有Java類的公共屬性和方法,下面是四個常用方法.
? ? ? ? ? ? ? ?public boolean equals(Object obj) :該方法本意用于兩個對象的“深度”比較,也就是比較兩對象封裝的數據是否相等;而比較運算符“==”在比較兩對象變量時,只有當兩個對象引用指向同一對象時才為真值。但在Object類中,equals方法是采用“==”運算進行比較;
? ? ? ? ? ? ? ?public String toString():該方法返回對象的字符串描述,建議所有子類都重寫此方法。
? ? ? ? ? ? ? ?public final Class getClass():返回對象的所屬類;
? ? ? ? ? ? ? ?protected ?void ?finalize(): 該方法Java垃圾回收程序在刪除對象前自動執行。
? ? ? ? ? Class類
? ? ? ? ??1.獲取Class類型的對象
? ? ? ? ? ? ? ?Class類封裝一個對象和接口運行時的狀態,當裝載類時,Class類型的對象自動創建。有以下3種方法可以獲取Class的對象。
? ? ? ? ? 方法1:調用Object類的getClass()方法。
? ? ? ? ? 方法2:使用Class類的forName()方法。
? ? ? ? ? 方法3:如果T是一個Java類型,那么T.class就代表了與該類型匹配的Class對象。例如,String.class代表字符串類型,int.class代表整數類型。
? ? ? ? ? 2.Class類的常用方法
? ? ? ? ? ? ? ?java運行環境中提供了反射機制,這種機制允許程序中動態獲取類的信息,以及動態調用對象的方法.? ? ? ? ? ??
? ? ? ? ? ? ? ?[1] static Class<?> forName(String className):返回給定串名相應的Class對象。
? ? ? ? ? ? ? ?[2] T newInstance():創建類的一個實例。
? ? ? ? ? ? ? ?[3] String getName():返回Class對象表示的類型(類、接口、數組或基類型)的完整路徑名字符串。
? ? ? ? ? ? ? ?[4] Method[] getMethods():返回當前Class對象表示的類或接口的所有公有成員方法對象的數組。
進一步利用Method類提供的invoke方法可實現相應類的成員方法的調用。
? ? ?Object invoke(Object obj,Object[ ] args)
? ? ? ? ? 其中,obj代表調用該方法的類實例對象,args代表存放方法參數的對象數組。
? ? ? ? ? ? ? ?Method getMethods(String name,Class…parameterType):返回指定方法名和參數類型的方法對象。
? ? ? ? ? ? ? ?Field[ ] getFields():返回當前Class對象表示的類或接口的所有可訪問的公有域對象的數組。
?6. 對象引用轉換?
? ? ?對象引用賦值轉換:?允許將子類對象賦值給父類引用,父類表示的范圍比較廣,反之則不行.?
? ? ?對象引用強制轉換?
? ? ? ? ??將父類引用賦值給子類變量時要進行強制轉換,強制轉換在編譯時總是認可的,但運行時的情況取決于對象的值.如果父類對象引用指向的就是該子類的一個對象,則轉換是成功的.否則會拋出異常.?
7. 內部類(一個類定義在另一個類里面)
? ? ?訪問特點:?內嵌類經過編譯后產生的字節碼文件名為:OuterOne$InnerOne.class?
? ? ? ? ? 1.內部類可以直接訪問外部類中的成員,包括私有。
? ? ? ? ? ? ? ?之所以可以直接訪問外部類的成員,是因為內部類中持有了一個外部類的引用,格式: 外部類名.this
? ? ? ? ? 2.外部類要訪問內部類,必須建立內部類的對象。
? ? ?內部類可以使用訪問控制符public、protected、private修飾?
? ? ? ? ? 靜態inner類(只能訪問外部內的靜態成員,出現了訪問局限) ? ??
內部類定義在成員位置上
? 可以被private static成員修飾符修飾。
? 被static修飾的內部類只能訪問外部類中的靜態成員。? ??
? ? ?內部類在定義在局部時(方法中的內部類):
? ? ? ? ? 內部類可以直接訪問外部類中的成員。
? ? ? ? ? 內部類在局部位置上只能訪問局部中被final修飾的局部變量。? ??
? ? ?匿名內部類?
? ? ? ? ? Java允許創建對象的同時定義類的實現,但是未規定類名,視為匿名內部類.
? ? ? ? ? 1.匿名內部類是內部類的簡寫
? ? ? ? ? 2.定義匿名內部類的前提: 必須是繼承一個類或實現接口.
7.?訪問控制修飾符
? ? ?1.公共訪問控制符public
? ? ? ? ? [1]作為類的修飾符,將類聲明為公共類, 表明它可以被所有的其它類所訪問和引用?
? ? ? ? ? [2]作為類的成員的訪問修飾符,表明在其他類中可以無限制地訪問該成員。?
? ? ? ? ? 要真正做到類成員可以在任何地方訪問,在進行類設計時必須同時滿足兩點:首先類被定義為public,其次,類的成員被定義為public。
? ? ?2.默認訪問控制符
? ? ? ? ??沒有給出訪問控制符情形,該類只能被同一個包中的類訪問和引用,不能被其他包中的類使用.
? ? ?3.私有訪問控制符private
? ? ? ? ? 用來聲明類的私有成員,它提供了最高級的保護.用private修飾的域和方法只能被該類自身訪問和修改,不能被任何其他類(包括該類的子類)來獲取和引用.
? ? ? ? ? 通常,出于系統設計的安全考慮,將類的成員屬性定義為private保護起來,而類的成員方法public對外公開,這是類封裝特性的一個體現.
? ? ?4.保護訪問控制符protected
? ? ? ? ??用protected修飾的成員可以在三種類中所引用:?
? ? ? ? ? ? ? ?該類本身;與它在同一個包中的其它類;在其它包中的該類的子類.
圖7.1
?
轉載于:https://www.cnblogs.com/elaa/p/3984005.html
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的04_Java面向对象特征之继承与多态的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C#中要使一个类支持FOREACH遍历,
- 下一篇: DDLog设置方法