3.2 構造器、this、包機制、訪問修飾符、封裝
構造器
構造器:在例項化的一個物件的時候會給物件賦予初始值,因此我們可以通過修改構造器,來改變物件的初始值,構造器是完成物件的初始化,並不是建立物件
我們也可以建立多個構造器實現不同的初始化,即構造器的過載
預設初始化:
- 數字: 整形是0 浮點型是0.0
- char:u0000
- boolean:false
- 引用: null
一個類即使什麼也不寫,它的class檔案也會自帶一個構造方法,這個方法也叫構造器;當然我們也可以直接在java檔案裡寫一個構造器
構造器的規則:
- 方法的名字必須和類名相同
- 不能有返回值 也不能寫void
構造器的作用:
- 使用new的時候必須要有構造器,本質是在呼叫構造器
- 構造器一般用來初始化值
預設的無參構造器:(下圖為隱式無參構造)
修改後的無參構造器:(下圖為顯式無參構造)
有參構造:
一旦定義了有參構造,無參構造就必須顯式定義,否則new一個無參的物件時會報錯
有參構造的使用如下圖:
物件建立的流程: (下圖出自B站韓順平教育,韓老師yyds!!)
- 載入Person類資訊(Person.class)
- 在堆中分配空間
- 完成物件初始化
- 預設初始化age=0 name=null
- 顯示初始化 age=90,name=null
- 構造器的初始化 age=20,name=“小倩”
- 把物件在堆中的地址返回給 p(p是物件名,也可以是物件的引用)
this
先來一個小實驗:
這時候this就很有用了。使用this可以解決構造器中的age、name是區域性變數而不是屬性的問題
再來一個小實驗:
結論:當我們new了很多個物件時,每個物件都有自己的this,this指向堆中的物件本身,簡單來說,那個物件呼叫,this就代表哪個物件
this的注意事項和使用細節:
- this關鍵字可以用來訪問本來的屬性、方法、構造器
- this用於區分當前類的屬性和區域性變數
- 訪問同類中其他方法的語法:this.方法名(引數列表);
- 訪問構造器語法:this(引數列表)(引數列表不用寫引數型別);注意只能在構造器中使用,且必須是第一條語句(即只能在構造器中訪問另外一個構造器)
- this不能再類定義的外部使用,只能在類定義的方法中使用
包機制
包的本質就是建立資料夾來存放類
一般利用域名倒置作為包名
定義包:package pkg1.pkg.2 必須寫在最上面 package是關鍵字;一個類中最多隻有一個package
為了使用某個包的成員,需要在java程式中匯入這個包 用import pkg1.pk2 import必須在定義包的下面 如: import com.ohj.* 匯入com.ohj這個包下所有的類;
若使用兩個包中相同名字的類時,第一個使用的類import匯入包,第二個使用的類不能通過import,而是通過直接通過路徑加上類來使用
使用哪個類,就匯入哪個類,不建議用 *
包命名規範:
- 包名只能是數字、字母、下劃線、小圓點,數字不開頭,不能是關鍵字
- 一般都是小寫
- 一般寫成: com.公司名.專案名.業務模組名
常用的包:
- java.util.* //util包,系統提供的工具包,工具類
- java.net.* //網路包,網路開發
- java.awt.* //做java頁面開發的,GUI
訪問修飾符
訪問修飾符用於控制方法和屬性以及類的訪問許可權,分為4種:
- public:公開級別,對外公開
- protected:受保護級別,對子類和同一個包中的類公開
- default:預設級別,直接沒有修飾符號就是default,向同一個包中的類公開
-
private:私有級別,只有類本身可以訪問,不對外公開,外面需要通過get、set方法來進行使用
方法和屬性的修飾符能用上面的四種,但是類的只能用public和預設
封裝
封裝的好處:
- 隱藏實現細節
- 可以對資料進行驗證,保證安全合理
封裝也就是避免直接訪問物件中資料的實際表示,通過操作介面來訪問
封裝大多數是對於屬性來進行操作的,也就是屬性私有,關鍵字private;通過封裝可以讓別的類無法使用自己的私有屬性。
通過在設定屬性的時候在前面加上private關鍵字 讓屬性變得私有。
private與public 是對立的
既然屬性已經私有了,那麼別的類想用這個屬性的時候,必須在屬性所在的類裡提供一些可以操作這個屬性的方法,也就是get和set
get:可以獲得這個屬性 get的時候也有駝峰命名法,規則就是get+大寫屬性的一個字母
set:可以給這個屬性設定值 set的時候也有駝峰命名法,規則就是set+大寫屬性的一個字母 set方法是void型別,且必須要有個引數
若定義了有參構造器,有參構造器避開了set方法,避開了資料的驗證,那麼我們可以在有參構造器中呼叫set方法,這樣資料就不會通過構造器規避了資料驗證
我們可以通過在set方法裡設定一些判斷,來規避掉不合理的值
操作如下圖:
封裝可以提高程式的安全性,保護資料;可以隱藏程式碼的實現細節;統一了介面也就只用get、set