第十五、Java面向對象三大特性之封裝

面向對象三大特徵:
1. 封裝
2. 繼承
3  多態


一、封裝

我們日常使用的電腦主機,把cpu、內存、主板等等都封裝到機箱裏面去。假如沒有機箱的話的出現什麼問題,主機、主板全部都散落在一處,然後開機沒有開機按鈕,那麼需要我們直接操作接跳線才能把電腦開啓。這樣子的話假如操作不慎的話,會讓機器損壞危險,那麼假如用機箱封裝起來的話,那麼就不需要這樣子做了。體現了封裝的---安全特性。

你拿電腦去加內存,可以直接給電腦給維修的人,等他加好內存了之後。你拿到的還是那個機箱,裏面發生了怎樣子的變化你並不知道。封裝的第二個好處-將變化隔離。

在機箱裏面提供一個開機按鈕,而不需要你直接使用跳線開機的話,體現了封裝的—便於使用的特性。

只要機箱提供了一個開機的功能,然後無論這個機箱拿到哪裏去,都可以使用這個開機的功能.體現了封裝的---提供重複性的特性。

二、需求: 

            使用java類描述網站的會員。

問題: 性別有問題??如果別人註冊性別填寫人妖

原因: 由於其他人可以直接操作sex屬性。可以對sex屬性進行了直接的賦值。

總結:如果不使用封裝,很容易賦值錯誤,並且任何人都可以更改,造成信息的不安全。

問題解決:使用封裝

權限修飾符:

            權限修飾符就是控制變量可見範圍的。

public :  公共的。 public修飾的成員變量或者方法任何人都可以直接訪問。
private : 私有的, private修飾的成員變量或者方法只能在本類中進行直接訪問。

三、封裝的實現

設置類的屬性爲private(關鍵字),不能使用對象名.屬性名的方式直接訪問對象的屬性。

封裝的步驟:

1. 使用private修飾需要被封裝的屬性。
2. 提供一個公共的方法設置或者獲取該私有的成員屬性。
命名規範:
set屬性名();
get屬性名(); 


疑問: 封裝一定要提供get或者set方法嗎?
不一定, 根據需求而定的。


規範 : 在現實開發中一般實體類的所有成員屬性(成員變量)都要封裝起來。
實體類:實體類就是用於描述一類 事物的就稱作爲實體類。例如:汽車

工具類(Arrays數組的工具類):


封裝的好處:

1. 提高數據的安全性。
2. 操作簡單。(相對於團隊其他開發者調用) 

3. 隱藏了實現。


代碼實現

 class Member{
	
	public	String name; //名字
	private	String sex; //性別
	public	int salary; //薪水
	
	//定義一個公共的方法設置sex屬性
	public void setSex(String s){
		if (s.equals("男")||s.equals("女")){ //注意: 如果比較兩個字符串的內容是否一致,不要使用==比較, 使用equals方法。
			sex = s;
		}else{
			//默認是男
			sex = "男";
		}
	}

	//定義一個公共的方法獲取sex屬性
	public String getSex(){
		return sex;
	}

	//聊天
	public void talk(){
		System.out.println(name+"聊得非常開心");
	}
}

class myClass{

	public static void main(String[] args) 
	{
		Member m = new Member();
		m.name=“鳳姐”;
		m.setSex("女");
		m.salary  = 800;
		System.out.println("姓名:"+ m.name+" 性別:"+ m.getSex()+" 薪水:"+ m.salary);
	}
}


需求2: 使用java類描述一個計算器類,計算器具備操作數1, 操作數2 、操作符三個公共 的屬性,還具備計算的功能行爲。 
要求: 不能直接對操作數1,操作數2,運算符這些屬性進行直接 的賦值,要封裝起來。 (+ - * /  )
根據需求提供get或者set方法。
需要提供set方法

//計算器類
class Calculator{

	private int num1; //操作數1
	private int num2;  //操作數2
	private	char option ; //運算符	

	//提供公共的方法設置屬性值....					
	public void initCalculator(int n1 , int n2 , char o){
		num1 = n1;
		num2 = n2;
		if(o=='+'||o=='-'||o=='*'||o=='/'){
			option = o;
		}else{
			option = '+';	
		}
	
	}
//因爲用戶輸入的操作數 不需要再返回給用戶,所以不需要寫get方法

	//計算的功能
	public void calculate(){
		switch(option){
			case '+':
				System.out.println("做加法運算,結果是:"+(num1+num2));
				break;
			case '-':
				System.out.println("做減法運算,結果是:"+(num1-num2));
				break;
			case '*':
				System.out.println("做乘法運算,結果是:"+(num1*num2));
				break;
			case '/':
				System.out.println("做除法運算,結果是:"+(num1/num2));
				break;
		}
	}


}




class MyClass 
{
	public static void main(String[] args) 
	{
		//創建了一個計算器對象
		Calculator c = new Calculator();
		//設置屬性值
		c.initCalculator(1,2,'a');
		//調用計算器的計算功能
		c.calculate();

	}
}




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章