面向對象高級第一天 static關鍵字 是靜態的意思,可以修飾成員變數,也可以修飾成員方法 成員變數的分類 靜態成員變數 有static修飾,屬於類,與類一起載入,記憶體中只有一份,可以被共用訪問。 什麼時候用呢?如果信息要被共用,只需要一份就用靜態成員變數,比如:系統線上人數。 訪問規則: 建議用類 ...
static關鍵字
是靜態的意思,可以修飾成員變數,也可以修飾成員方法
成員變數的分類
-
靜態成員變數
-
有static修飾,屬於類,與類一起載入,記憶體中只有一份,可以被共用訪問。
-
什麼時候用呢?如果信息要被共用,只需要一份就用靜態成員變數,比如:系統線上人數。
-
訪問規則:
建議用類名訪問:類名.靜態成員變數
同一個類中,訪問靜態成員可以省略類名不寫。
理論上也可以這樣訪問:對象名.靜態成員變數(不推薦)
-
-
實例成員變數
-
無static修飾,屬於對象,每個對象中都存在一份實例成員變數。比如:name age
-
什麼時候用呢?比如:name age,每個對象中都有這些信息,而且信息還不同時,定義成實例成員變數。
-
訪問規則:
-
只能用:對象名.實例成員變數。
-
靜態成員方法
-
有static修飾,屬於類,與類一起載入,可以被共用訪問。
-
什麼時候用呢?如果是做一個通用功能,可以用靜態成員方法。
-
訪問規則:
建議用類名訪問:類名.靜態方法
註意:同一個類中,訪問靜態成員可以省略類名不寫。
理論上也可以這樣訪問:對象名.靜態成員方法(不推薦) -
靜態成員方法的應用:工具類
是什麼? 工具類中都是靜態方法,為了完成一個共用功能
好處:一次編寫,處處可調,提高代碼的復用性,提高開發的效率。
註意:建議把工具類的構造器私有化,因為工具類無需對外創建對象,它的方法都是靜態方法,直接用類名訪問即可。
-
-
實例成員方法
-
無static修飾,屬於對象,必須用對象觸發訪問。
-
什麼時候用呢?如果這個方法屬於對象,而且要直接訪問對象的實例成員,則聲明成實例方法。
-
訪問規則:
只能用:對象名.實例成員方法。
-
static的應用知識
代碼塊
-
是什麼? 類的5大成分(成員變數、成員方法、構造器、代碼塊、內部類)之一
-
分類
-
靜態代碼塊:(重點瞭解一下)
格式:static {}
特點:屬於類,與類一起優先載入,自動觸發執行一次。
作用:可以用於在程式啟動時,進行靜態資源的初始化操作 -
實例代碼塊(幾乎不用):
格式:{}
特點:屬於對象的,每次調用構造器構建對象前都會執行一次,再執行構造器。
作用:可以用於初始化實例資源
-
單例設計模式
-
單例是一種設計模式,是為瞭解決某個問題
-
單例能解決的問題:保證一個類對外只能產生一個對象。
-
重點在於如何實現單例:
-
餓漢單例
-
特點:拿對象時,對象已經存在
-
實現步驟:
/**
* 餓漢單例設計模式
*/
public class SingleInstance {
// 1.定義一個類,將構造器私有
private SingleInstance() {}
// 2.對外提供一個靜態對象
// 餓漢單例是在獲取對象前,就已經準備好了一個對象
// 這個對象只能通過類名訪問,所以定義成static的
public static SingleInstance instance = new SingleInstance();
}
-
懶漢單例
-
特點:要拿對象的時候,才開始創建一個對象。
-
實現步驟:
/**
* 懶漢單例設計模式
*/
public class SingleInstance2 {
// 2.定義一個靜態的成員變數負責存儲一個對象,只載入一次,只有一份。
// 專業的做法是:這裡私有化,這樣可以避免給別人挖坑
private static SingleInstance2 instance2;
// 1.將構造器私有化
private SingleInstance2() {}
// 3.對外提供一個靜態的獲取對象的方法
public static SingleInstance2 getInstance2() {
if (instance2 == null) {
// 第一次來拿對象 :此時需要創建對象。
instance2 = new SingleInstance2();
}
return instance2;
}
}
-
面向對象的三大特征之二:繼承
繼承概述、使用繼承的好處
-
什麼是繼承? Java允許一個類通過extends與另一個類建立父子關係,這就是繼承。
-
繼承的格式:
-
子類 extends 父類
-
-
繼承的特點:
-
子類繼承父類後,就可以得到父類的屬性和行為。
-
-
繼承的核心優點:
-
提高代碼的復用性,多個子類的相同代碼可以放在父類中,增強了類的擴展性。
-
繼承的設計規範、記憶體運行原理
-
設計規範:子類共用屬性和行為放在父類,子類獨有屬性和行為放在子類自己那裡。
-
記憶體原理:
子類對象實際上是由子父類這兩張設計圖共同創建出來的。
繼承的特點
-
Java是單繼承模式:一個類只能繼承一個直接父類。
-
Java不支持多繼承、但是支持多層繼承。
-
Java中所有的類都是Object類的子類。
繼承後:方法重寫
-
概念:子類重寫了一個聲明與父類一樣的方法,覆蓋父類的方法。子類認為父類的該方法不好用,以後用自己重寫的方法。
-
重寫方法建議加上一個重寫校驗註解:@Override
-
作用:要求必須是正確重寫的才不報錯
-
作用2:可讀性好
-
-
重寫的要求:
-
重寫方法的名稱和形參列表必須與父類被重寫方法的名稱和形參列表一致(重點)
-
私有方法不能重寫
-
靜態方法不能重寫
-
重寫方法的許可權 >= 被重寫方法的訪問許可權。
-
-
在重寫的方法中如果想要訪問父類的方法怎麼辦呢?
-
super.方法名();
-
繼承後:成員變數、成員方法的訪問特點
-
就近原則
-
this.子類自己的成員變數
-
在子類方法中訪問父類成員怎麼辦? super.父類成員變數/父類成員方法
繼承後:子類構造器的特點
-
特點:子類的全部構造器預設都會先訪問父類的無參數構造器,再執行自己的構造器
-
為什麼呢? 先有爸爸才有兒子。 先調用父類的構造器初始化父類的數據,再調用自己的構造器初始化自己的數據。
-
代碼層面:預設子類構造器的第一行都有一個super(), 訪問父類的無參數構造器,寫不寫都有
繼承後:子類構造器訪問父類有參構造器
-
調用父類有參數構造器,初始化繼承自父類的數據。
-
super(....) 根據參數調用父類構造器
this、super使用總結
-
this訪問子類當前對象的成員。
-
super:在子類方法中指定訪問父類的成員。
-
this(...) : 訪問本類兄弟構造器
-
super(...):在本類構造器中指定訪問父類的構造器
-
註意事項:super(...) 必須放在第一行,this(...) 也必須在第一行。因此2者不能共存一個構造器中。