面對對象的三大特徵:
- 封裝
- 繼承
- 多態
有了封裝,才能繼承,有了繼承,才能說多態
定義
什麼是封裝?封裝有什麼好處?
是指利用抽象數據類型將數據和基於數據的操作封裝在一起,使其構成一個密不可分的獨立實體,數據被保護在抽象數據類型的內部,儘可能地隱藏內部細節,只保留一些對外接口使之與外部發生聯繫,系統的其他對象只能通過包裹在數據外面的已被授權的操作來與這個封裝的對象進行交流和交互。
封裝的作用有兩個:
第一個作用:保證內部結構的安全
第二個作用:屏蔽複雜,暴露簡單
怎麼封裝,代碼怎麼寫?
- 屬性私有化
- 1個屬性對外提供兩個set和get方法。對外程序只要通過set方法修改,只能通過get方法讀取。可以通過在set方法中設立關卡來保證數據的安全性,
在強調一下:
set和get 方法都是實例方法,不能帶static。
不帶static的方法被稱爲實例方法,實例方法的調用必須先new對象。
set和get方法寫的時候有嚴格的規範要求:(要按照規矩來)
set方法格式:
public void set+屬性名首字母大寫(1個參數){
xxx = 1個參數;
}
get方法格式:
public void get+屬性名首字母大寫(無參數){
return xxx;
}
儘量按照java規範中要求的格式提供set和get方法。
如果不按照這個規範格式來,那麼你的程序將不是一個通用的程序。
代碼
Person 表示人類:
- 每一個人都有年齡這樣的屬性。
- 年齡age,int 類型
不使用封裝
我這裏先不使用封裝機制,分析程序存在什麼缺點?
person 類的age屬性對外暴露,可以在外部程序中隨意訪問,導致不安全。
//這個個沒有封裝的Person
public class Person{
int age;//age 屬性是暴露的,在外部程序中可以隨意的訪問,導致了不安全。
}
嘗試封裝
不再對外暴露覆雜的數據,封裝起來
對外只提供簡單的操作入口
優點:第一數據安全了。第二調用者方便了。
public class Person {
//private 表示私有的,被這個關鍵字修飾後,該數據只能在本類中訪問。
//出了這個類,age屬性就無法訪問了,私有的。
private int age;//每個人的年齡值不同,對象級別的屬性
//寫一個方法專門用來完成讀(get)
//寫一個方法專門用來完成寫(set)
//get方法和set方法應該被定義爲實例方法
//get讀年齡,set改年齡,這個讀和改都是操作一個對象的年齡。(沒有對象哪有年齡?)
//封裝的第二步:對外提供公開的set方法和get方法作爲操作的入口。並且不帶static
// 【修飾符列表】 返回值類型 類名 方法名(形參){
//}
//get方法 是讀的,需要返回值,不需要傳參數;所以要有返回值的類型int ,形參爲空
public int getAge(){
return age;
}
//set方法 是寫入, 不需要返回值,但是要傳入參數;所以 返回值類型爲void,形參爲int
public void setAge(int nianling){
// 能不能在這個位置設置關卡!!!
if(nianling<0 || nianling>120){
System.out.println("輸出的年齡不合法,請重新賦值");
return; //直接終止程序的運行
}
//程序運行到這一步,年齡是合法的
age = nianling;
}
}
main程序
public class PersonTest{
public static void main(String[] args) {
//創建一個對象
Person p1 = new Person();
//讀取年齡
System.out.println(p1.getAge());//0
//傳入年齡
p1.setAge(23);
System.out.println(p1.getAge());//23
//
// //傳入年齡 (非法)
p1.setAge(-100);
System.out.println(p1.getAge());//23
}
}