1. 程式人生 > >第六天(下) 封裝和this

第六天(下) 封裝和this

demo 有關 修飾 在外 錯誤 其他 變量 static 組成

封裝(有時候也叫數據隱藏).是與對象有關的一個重要概念,從形式上來看,封裝是將數據和行為組合在一個包中,並對 對象的使用者隱藏了數據的實現方式.

封裝的關鍵在於絕不能讓類中的方法直接訪問其他類的數據,程序僅通過對象的方法與對象數據 進行交互.封裝給予了對象黑盒的特性.這是提高重用性和可靠性的關鍵.

封裝的表現:方法就是一個最基本封裝體,類也是一個封裝體

封裝的好處:

1提高的代碼的復用性.

2隱藏了實現細節,還要對外提供可以訪問的方式,便於調用者的使用,(封裝的核心之一,或者也可以說是封裝 概念)

3提高了安全性.

4 可以對成語變量進行更精準的控制(在set方法中加入if語句等)

封裝的舉例: (機箱)

一臺電腦有cpu,主板,顯卡等部件組成,將這些部件組合在一起就可以用電腦了,但是這些東西都散落在外面,很容易造成不安全的因素,於是,就用機箱把所有東西裝在裏面,在機箱上留下插口等.

機箱就隱藏了各種部件的細節,對外提供了插口和開關等訪問內部細節的方式.

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