標籤:
什麼是封裝
所謂的封裝就是把資料項目和方法作為一個獨立的整體隱藏在對象的內部,具體的實施細節不對外提現,僅僅保留有限的外部介面,封裝外的使用者只能通過介面來進行操作。就好比開啟一台電腦需要進行很多個步驟,電源供電、BIOS自檢、尋找硬體等等一系列動作,而我們只需要按下開機按鈕,其餘的動作都是電腦內部完成的,這裡就可以看作是電腦對啟動的一系列動作進行了封裝,給提供了開機按鈕供我們調用。
為何需要封裝
首先,從程式安全性上來說,暴露在外面的細節被隔離掉,要想修改內部的資料,必須使用提供的特定方法,而這些方法中又做了限制,可以確保值設定合法的值。
其次,封裝後的程式只對外提供特定的介面以供調用,而其內部如何?與外界無關,所以當修改程式的時候,只要保證介面正確,其內部如何?可以自己隨意去修改,而不用擔心會受到外界值的影響。
JAVA中的許可權控制符
private:只能自己訪問使用
public:允許所有外部類訪問使用
protected:允許子類和同包類訪問使用
default:只允許同類或同包使用
JAVA中的包
JAVA中為瞭解決類的命名問題,實作類別檔案的管理引入的包機制。通常我們將一組功能相同的類放在同一個包下,從而形成邏輯上的類的集合。
程式的第一行使用
package 包名
來表示該類位於某個包中。一旦類中使用的package語句,就意味著該源檔案裡面定義的所有類都屬於這個包。
如果要使用其他包中的類,則需要是用import關鍵字來匯入指定包下的某個類。
java中的常用包:
java.lang:該包包含了JAVA語言的核心類,如String、Math、System和Thread等,使用這個包下的類無須使用import語句匯入,系統會自動匯入該包下的所有類
java.util:這個包包含了JAVA的大量工具類、介面和集合架構類、介面,例如Arrays和List、Set等
java.net:這個包下包含了一些JAVA網路編程相關的類和介面
java.io:這個包包含了一些JAVA輸入輸出的相關類和介面
java.sql:這個包包含了JAVA進行JDBC資料庫變成的相關類和介面
如何封裝
1、把所有的屬性藏起來。
2、把儘可能多的東西藏起來.對外提供簡捷的介面。
3、對操作介面進行合法性驗證
class Animal { // 定義private許可權的name和age屬性 private String name; private int age; // 提供對外使用的getName、setName、getAge和setAge方法 // 在方法內部進行合法性驗證 public String getName() { return name; } public void setName(String name) { if (name.length() <= 0) { System.out.println("名字太短啦"); } else { this.name = name; } } public int getAge() { return age; } public void setAge(int age) { if (age <= 0) { System.out.println("年齡太小啦"); } else { this.age = age; } }}public class Test { public static void main(String[] args) { Animal animal = new Animal(); // 執行時候,如果直接使用animal.name,系統會拋出異常 // Exception in thread "main" java.lang.Error: Unresolved compilation problem: // The field Animal.name is not visible // animal.name = "dog"; //必須使用animal.setName()來設定其name屬性 //animal.setName("");//直接傳入Null 字元串,又會提示“名字太短啦” animal.setName("dog"); }}JAVA中的this
this關鍵字總是指向調用該方法的對象。根據this出現位置的不同,this作為對象的預設引用有兩種情形:
1.構造器中引用該構造器正在初始化的對象
public class ThisDemo { // 定義一個名為num的成員變數 public int num; public ThisDemo () { // 使用this代表該構造器正在初始化的對象 // 下面的代碼將會把該構造器正在初始化的對象的foo成員變數設為6 this.num= 6; } public static void main(String[] args) { // 所有使用ThisDemo 建立的對象的num成員變數均為6 System.out.println(new ThisInConstructor().num); }}
2.在方法中引用調用該方法的對象
public class Dog { // 定義一個jump()方法 public void jump() { System.out.println("正在執行jump方法"); } // 定義一個run()方法,run()方法需要藉助jump()方法 public void run() { this.jump(); System.out.println("正在執行run方法"); }}
如果方法裡有個局部變數和成員變數同名,但程式又需要在該方法裡訪問這個被覆蓋的成員變數,則必須使用this首碼。
public class Test { private int num = 13; public void setNum(int num) { this.num = num; } public int getNum() { return num; } public static void main(String[] args) { Test t = new Test(); t.setNum(15); System.out.println(t.getNum()); }}
this引用也可以用於構造器中作為預設引用,由於構造器是直接使用new關鍵字來調用,而不是使用對象來調用,所以this在構造器中代表該構造器正在初始化的對象
public class ReturnThis { public int age; public ReturnThis grow() { age++; // renturn this返回調用該方法的對象 return this; } public static void main(String[] args) { ReturnThis rt = new ReturnThis(); // 可以連續調用同一個方法 rt.grow().grow().grow(); System.out.println("re的age成員變數值是:" + rt.age); //re的age成員變數值是:3 }}
this()表示調用構造方法(需注意:建構函式調用必須在建構函式中的第一條語句)
public class Test { public Test() { System.out.println("無參建構函式"); } public Test(int num) { this(); System.out.println("一個參數的建構函式"); } public static void main(String[] args) { Test t = new Test(2); }}//輸出結果為:無參建構函式 一個參數的建構函式
JAVA筆記整理(四),JAVA中的封裝