《瘋狂java講義2》讀書筆記——面向對象的三大特性之一封裝

封裝java

        封裝(Encapsulation)是指將對象的狀態信息隱藏在對象內部,不容許外部程序直接訪問對象內部信息,而是經過該類提供的方法來實現對內部信息的操做和訪問。編程

        封裝是面向對象編程語言對客觀世界的模擬,客觀世界裏的Field都是杯隱藏在對象內部的,外界沒法直接操做和修改。(個人我的理解就是:比如一我的,這我的具備年齡,身高,體重等屬性,年齡只能隨着時間流逝增長,不能你說多少歲就是多少歲。)對一個類或對象實現良好的封裝,能夠實現如下目的:安全

        》隱藏類的實現細節。編程語言

        》讓使用者只能經過事先預約的方法來訪問數據,從而能夠在該方法里加入控制邏輯,限制對Field的不合理訪問。this

        》可進行數據檢查,從而有利於保證對象信息的完整性。code

        》便於修改,提升代碼的可維護性。對象

        爲了實現良好的封裝,須要從兩方面考慮。get

        》將對象的Field和實現細節隱藏起來,不容許外部直接訪問。io

        》把方法暴露出來,讓方法來控制對這些Field進行安全的訪問和操做。編譯

        封裝實際上有兩個方面的含義:把該隱藏的隱藏起來,把該暴露出來的暴露出來。這就須要經過使用java提供的訪問控制符來實現。

使用訪問控制符

       java提供了4種訪問控制符:private,default,protected和public. 分別表明了4個訪問級別。

        private(當前類訪問權限) ,default(包訪問權限),protected(子類訪問權限),public(公共訪問權限)。注:我比較懶,不想寫後面的,這方面看了知道就能夠了。

public class Person
{
	//將Field使用private修飾,將這些Field隱藏起來
	private String name;
	private int age;
	//提供方法來操做name Field
	public void setName(String name) 
	{
		//執行合理性校驗,要求用戶名必須在2~8位之間
		if (name.length()>8||name.length()<2)
		{
			System.out.println("您設置的任命不符合要求");
			return;
		}
		else 
		{
			this.name = name;
		}
	}
	public String getName() 
	{
		return this.name;
	}
	//提供方法來操做age Field
	public void setAge(int age) 
	{
		//執行合理性校驗,要求用戶年齡必須在0~100之間
		if (age>100||age<0)
		{
			System.out.println("您設置的年齡不合法");
			return;
		}
		else 
		{
			this.age = age;
		}
	}
	public int getAge() 
	{
		return this.age;
	}
}

 

下面程序在main方法中建立一個Person對象,並嘗試操做和訪問該對象的age和name兩個Field。

public class PersonTest
{
	public static void main(String[]args)
	{
		Person p = new Person();
		//由於age Field已經被隱藏,因此下面的語句將出現編譯錯誤
		//p.age = 1000;
		//下面語句編譯不會出現錯誤,但運行時將提示「您設置的年齡不合法」
		//程序不會修改p的age Field
		p.setAge(1000);
		//訪問p的age Field也必須經過其對應的getting方法
		//由於上面從未成功設置p的age Field,故此處輸出0
		System.out.println("未設置age Field時:"+ p.getAge());
		//成功修改p的age Field
		p.setAge(30);
		System.out.println("成功設置age Field後:"+ p.getAge());
		//設置名字的方法和年齡類似
		p.setName("夏幸運");
		System.out.println("成功設置name Field後:"+ p.getName());
	}
}

 

關於訪問控制符的使用,存在幾條基本原則。

》類裏的絕大部分Field都應該使用private修飾,只有一些static修飾的,相似全局變量的Field,纔可能考慮使用public修飾。

》若是某個類主要是用作其餘類的父類,該類裏包含的大部分方法可能僅但願被其子類重寫,而不想被外界直接調用,則應該使用protected修飾這些方法。

》但願暴露出來給其餘類自由調用的方法應該使用public修飾。

相關文章
相關標籤/搜索