【本節目标】
通過閱讀本節内容,你将深刻了解封裝對象屬性的重要性,并學會如何按照Java開發标準正确地實作屬性封裝與通過封裝的方法在類外調用其屬性。
4.1 成員屬性封裝
在類之中的組成就是屬性與方法,一般而言方法都是對外提供服務的,是以是不會提供封裝處理的,而對于屬性,由于其需要較高的安全性,是以往往需要對其進行保護,這種情況下,就需要采用封裝性對屬性進行保護。
在預設情況下,對于類中的屬性是可以通過其他類利用對象重複調用的。
範例:屬性不封裝情況下的問題
class Person{ //定義一個類
String name ; //人員的姓名
int age ; //人員的年齡
public void tell() {
System.out.println(“姓名:”+ name +”、年齡:”+age) ;
}
}
public class JavaDemo { //主類
public static void main(String args[]) {
Person per = new Person() ; //聲明并執行個體化對象
per.name = “張三” ; //在類外部修改屬性
per.age = -18 ; //在類外部修改屬性
per.tell() ; //進行方法的調用
}
}
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5SZzczN3EzY2ADMyU2YjNWO2E2Y0MDZwQDO3QmZ1MTYl9CX5d2bs92Yl1iclB3bsVmdlR2LcNWaw9CXt92Yu4GZjlGbh5yYjV3Lc9CX6MHc0RHaiojIsJye.png)
圖一 執行結果一
此時在person類中提供的name與age兩個屬性并沒有進行封裝處理,這樣外部就可以直接進行調用,但是有可能設定的資料是錯誤的資料(per.age = -18 ;)。如果要想解決這樣的問題就可以利用private關鍵字對屬性進行封裝處理。
範例:對屬性進行封裝
class Person{ //定義一個類
private String name ; //人員的姓名
private int age ; //人員的年齡
public void tell() {
System.out.println(“姓名:”+ name +”、年齡:”+age) ;
}
}
public class JavaDemo { //主類
public static void main(String args[]) {
Person per = new Person() ; //聲明并執行個體化對象
per.name = “張三” ; //在類外部修改屬性
per.age = -18 ; //在類外部修改屬性
per.tell() ; //進行方法的調用
}
}
圖二 執行結果二
而屬性一旦封裝之後外部将不能夠直接通路,即:對外部不可見,但是對類的内部是可見的,如果想讓外部的程式可以通路封裝的屬性,則在Java開發标準中提供有如下要求:
【setter、getter】設定或取得屬性可以使用setXxx()、getXxx()方法,以:private String name 為例;
- 設定屬性方法:public void setName(String n);
- 擷取屬性方法:public String getName()。
範例:實作封裝
class Person{ //定義一個類
private String name ; //人員的姓名
private int age ; //人員的年齡
public void tell() {
System.out.println(“姓名:”+ name +”、年齡:”+age) ;
}
public void setName(String n){
name = n ;
}
public void setAge(int a){
age = a ;
}
public String getName(){
return name ;
}
public int getAge (){
return age;
}
}
public class JavaDemo { //主類
public static void main(String args[]) {
Person per = new Person() ; //聲明并執行個體化對象
per.setName = (“張三”) ; //在類外部修改屬性
per.setAge = (-18) ; //在類外部修改屬性
per.tell() ; //進行方法的調用
}
}
圖三 執行結果三
年齡是負數,不符合正常。
修改:
class Person{ //定義一個類
private String name ; //人員的姓名
private int age ; //人員的年齡
public void tell() {
System.out.println(“姓名:”+ name +”、年齡:”+age) ;
}
public void setName(String n){
name = n ;
}
public void setAge(int a){
if(a >= 0){
age = a ;
}
}
public String getName(){
return name ;
}
public int getAge (){
return age;
}
}
public class JavaDemo { //主類
public static void main(String args[]) {
Person per = new Person() ; //聲明并執行個體化對象
per.setName = (“張三”) ; //在類外部修改屬性
per.setAge = (-18) ; //在類外部修改屬性
per.tell() ; //進行方法的調用
}
}
圖四 執行結果四
在以後進行任何類定義的時候一定要記住,類中所有屬性都必須使用private封裝,并且屬性如果要進行通路,必須要提供有setter、getter方法。
想學習更多的Java的課程嗎?從小白到大神,從入門到精通,更多精彩不容錯過!免費為您提供更多的學習資源。
本内容視訊來源于
阿裡雲大學 下一篇:“生而有值”—教你使用構造函數 | 帶你學《Java面向對象程式設計》之五 更多Java面向對象程式設計文章檢視此處