第六天(下) 封裝和this
封裝的關鍵在於絕不能讓類中的方法直接訪問其他類的數據,程序僅通過對象的方法與對象數據 進行交互.封裝給予了對象黑盒的特性.這是提高重用性和可靠性的關鍵.
封裝的表現:方法就是一個最基本封裝體,類也是一個封裝體
封裝的好處:
1提高的代碼的復用性.
2隱藏了實現細節,還要對外提供可以訪問的方式,便於調用者的使用,(封裝的核心之一,或者也可以說是封裝 概念)
3提高了安全性.
4 可以對成語變量進行更精準的控制(在set方法中加入if語句等)
封裝的舉例: (機箱)
機箱就隱藏了各種部件的細節,對外提供了插口和開關等訪問內部細節的方式.
Java封裝的實現步驟:
1修改屬性的可見性來限制對屬性的訪問(一般限制為private) 將name和age的屬性設置為私有,只有本類才可以訪問,其他類都訪問不了,從而實現了信息的隱藏.
2對每個值屬性提供對外的公共方法訪問,也就是創建一對賦值取值的方法,用於對私有屬性的訪問.
class Person { int age; String name; public void show() { System.out.println("age=" + age + ",name" + name); } } public class PersonDemo { public static void main(String[] args) { // 創建Person對象 Person p = new Person(); p.age = -20; // 給Person對象賦值 p.name = "人妖"; p.show(); // 調用Person的show方法 } }
我用代碼描述了一個Person,但有個嚴重的問題Person裏的屬性可以被隨意的訪問和更改,這不符合實際標註
這時候就需要一個關鍵字也就是修飾符private(私有,權限修飾符) 只要將類的屬性私有化,就無法直接訪問.
class Person { private int age; private String name; public void show() { System.out.println("age=" + age + ",name" + name); } }
屬性被私有了,錯誤的值不能賦了,可是正確的值也賦值不了,
根據之前學習的封裝的原理,隱藏後,還需要提供訪問方式.
一般對成員屬性的訪問方法賦值(set)取值(get),對私有的變量提供相應的訪問方式setXxx getXxx 屬性名的首字母大寫
class Person { // 私有成員變量 private int age; private String name; // 對外提供設置成員變量的方法 public void setAge(int a) { age = a; } // 對外提供訪問成員變量的方法 public void getAge() { return age; } }
我們現在把屬性隱藏了,也通過對外的方法實現了賦值取值,但是我們還是不能阻止 他賦予錯誤的值.
我們可以在set方法中添加if語句來增加限制
class Person { // 私有成員變量 private int age; private String name; // 對外提供設置成員變量的方法 public void setAge(int a) { // 由於是設置成員變量的值,這裏可以加入數據的驗證 if (a < 0 || a > 130) { System.out.println(a + "不符合年齡的數據範圍"); return; } age = a; } // 對外提供訪問成員變量的方法 public void getAge() { return age; } }
總結:類中不需要對外提供的內容都私有化,包括屬性和方法 以後再描述事物,屬性都私有化,並提供set get方法
註意:私有只是封裝的體現形式,並不是封裝就是私有化
this關鍵字:
(1)this調用本類中的屬性,也就是類中的成員變量;
(2)this調用當前對象
(3)this調用本類中的其他構造方法,調用時要放在構造方法的首行。
1)this()調用其他構造方法的語句只能放在構造方法(在其他普通方法裏是不行的)的首行;
2)在使用this調用其他構造方法的時候,至少有一個構造方法是不用this調用的。(必須要有結尾,不能無限期的調用下去,循環遞歸調用);
(4)對象的比較
this本類的對象引用 那個對象用this this就表示那一個對象
第六天(下) 封裝和this