這一節我們學習面向對象中的第一個特性,封裝(encapsulation)
封裝:是指隱藏對象的發生和實現細節,僅對外提供公共訪問方式.
那么什么是隱藏對象的實現細節?我們來舉例學習.
比如我們來定義一個人的類,簡單點說,人的屬性有年齡,行為有說話.
我們看下面的代碼:
~~~
class Person//定義一個人的類
{
int age;
void speak()
{
System.out.println("age = "+age);
}
}
class PersonDemo//定義測試類
{
public static void main(String[] args)
{
Person p = new Person();
p.age = -20;//這時代碼仍然正常運行了,這就造成了安全隱患
p.speak();
}
}
~~~
結果:

我們看到存在安全隱患,當我們為人的年齡屬性賦值為負數時,程序是正常運行的.
那么現在把Person類修改一下
~~~
<pre name="code" class="java">class Person
{
private int age;
void speak()
{
System.out.println("age = "+age);
}
}
~~~
~~~
~~~
結果:

我們看到報錯了,因為我們對age進行了私有,在PersonDemo類中無法訪問.
為了進一步解決問題,我們再對兩個類進行修改:
~~~
class Person
{
private int age;//把該成員屬性設置為私有
public void setAge(int a)
{
if(a>0 && a<130)
{
age = a;
speak();
}
else
System.out.println("錯誤的數據");
}
void speak()
{
System.out.println("age = "+age);
}
}
class PersonDemo
{
public static void main(String[] args)
{
Person p = new Person();
p.setAge(-20);//調用方法設置年齡,但是我們不知道該方法的內部實現
}
}
~~~
結果:

我們看到當age>0 && age<130時,才合法.
從這個過程我們看到,當我們要操作Person中的age屬性時,是通過setAge方法來實現的,但是setAge方法是怎么實現的,外部類是無法知道的,這就是我們所要說的隱藏對象的屬性和實現細節,也就是封裝.
其實對于屬性的封裝,為了外部訪問,我們一般有規范的get和set方法,我們來看一下兩個規范且常用的方法:
~~~
class Person
{
private int age;//把該成員屬性設置為私有
public void setAge(int a)//設置年齡
{
age = a;
}
public int getAge()//獲取年齡
{
return age;
}
}
~~~
下面我們再來說說封裝的優點和原則:
優點:
1.提高代碼安全性;
2.實現對內部屬性的可控性;
3.提高代碼的復用性;
4.隔離變化;
原則:
1.將不需要對外提供的內容都隱藏起來;
2.把屬性都隱藏起來,提供公共方法供外部訪問(當然不是所有方法都必須是公共方法).
最后我們再看一下剛才我們用到的一個關鍵字:private.
**private關鍵字**:指私有,是一個權限修飾符,用于修飾成員.私有的內容只在本類中有效.
它的常見用法:就是將成員變量私有化,對外提供對應的set,get方法對其進行訪問.提高對數據訪問的安全性.
注意:私有僅僅是封裝的一種體現而已.
對于java語言來講,最小的封裝體就是函數.類也是封裝體.框架本身也是封裝體.這些都一個共性,就是我們可以不知道實現細節,直接拿來用就可以了.
- 前言
- 1.1 基本常識
- 1.2 Java語言概述
- 1.3 Java語言的環境搭建
- 1.4 Java程序開發之初體驗--Hello World
- 2.1 關鍵字
- 2.2 標識符
- 2.3 注釋
- 2.4 常量
- 2.5 進制掃盲
- 2.6 變量和數據類型(1)
- 2.7 變量和數據類型(2)
- 2.8 運算符
- 3.1 if語句
- 3.2 switch語句
- 3.3 while和do-while語句
- 3.4 for語句
- 3.5 for循環的嵌套
- 3.6 break語句與continue語句
- 4.1 函數的定義
- 4.2 定義函數的兩個明確
- 4.3 函數的內存加載過程
- 4.4 函數的重載
- 5.1 數組的定義
- 5.2 數組的內存分配及特點
- 5.3 數組操作中常見問題
- 5.4 數組常用操作(1)
- 5.5 數組常用操作(2)
- 5.6 二維數組
- 6.1 面向對象的概述
- 6.2 類與對象的關系
- 6.3 對象的內存體現
- 6.4 成員變量與局部變量
- 6.5 類類型參數與匿名對象
- 6.6 基本數據類型參數與引用數據類型參數的傳遞過程
- 6.7 封裝
- 7.1 構造函數概述與默認構造函數
- 7.2 構造函數與一般函數的區別
- 7.3 構造函數的重載
- 7.4 構造函數的內存加載
- 7.5 構造函數需要注意的幾個細節
- 7.6 this關鍵字的原理
- 7.7 this關鍵字的細節與應用
- 8.1 static關鍵字之特點
- 8.2 成員變量與靜態變量的區別
- 8.3 static關鍵字使用的注意細節
- 8.4 main函數的解析與細節
- 8.5 static關鍵字的使用場景
- 8.6 靜態的內存加載
- 8.7 靜態代碼塊
- 8.8 構造代碼塊
- 9.1 繼承
- 9.2 單繼承與多重繼承
- 9.3 子父類中成員變量特征體現