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