封裝性是整個面向對象的第一大特性,所謂的封裝性是指類內部的操作對外部不可見。
我們提供的服務有:網(wǎng)站設計、網(wǎng)站建設、微信公眾號開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認證、銀州ssl等。為成百上千家企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務,是有科學管理、有技術的銀州網(wǎng)站制作公司
范例:觀察如下的程序問題
class Person { // 類名稱的單詞首字母必須大寫
String name ; // 姓名,是一個字符串所以使用String
int age ; // 年齡是一個整數(shù),所以使用int
public void tell(){ // 定義一個方法
System.out.println("姓名:" + name + ",年齡:" + age) ;
}
}
public class ClassDemo {
public static void main(String args[]){
Person per = new Person() ;
per.name = "張三" ;
per.age = -30 ;
per.tell() ;
}
}
此時的程序從技術(語法)上而言沒有任何的問題,但是從實際的生活(業(yè)務)上來看,一個人的年齡絕對不可能是-30歲,所以這個時候造成問題的主要原因就是類中的操作對外部可見。
此時,就可以通過封裝性來解決此類問題,如果現(xiàn)在要想對類中的屬性或方法封裝,可以直接使用private關鍵字完成。
class Person { // 類名稱的單詞首字母必須大寫
private String name ; // 姓名,是一個字符串所以使用String
private int age ; // 年齡是一個整數(shù),所以使用int
public void tell(){ // 定義一個方法
System.out.println("姓名:" + name + ",年齡:" + age) ;
}
}
public class ClassDemo {
public static void main(String args[]){
Person per = new Person() ;
per.name = "張三" ;
per.age = 99999 ;
per.tell() ;
}
}
此時,程序編譯之后出現(xiàn)了以下的錯誤信息:
ClassDemo.java:11: name has private access in Person
per.name = "張三" ;
^
ClassDemo.java:12: age has private access in Person
per.age = 99999 ;
^
2 errors
由于name和age兩個屬性被private聲明了(封裝了,私有)所以,現(xiàn)在根本無法被外部所訪問,很明顯,此時的屬性絕對安全,但是封裝歸封裝了,一個問題就出現(xiàn)了,現(xiàn)在的屬性無法操作了,無法操作就沒有意義了,所以此時,就可以給出一個概念,以后凡是類中的屬性在定義的時候必須封裝,封裝之后的屬性一定要通過setter、getter方法設置和取得。Setter和getter方法本身有自己的命名規(guī)范。
? 例如:private String name ;
? setter:public void setName(String na)
? getter:public String getName()
class Person { // 類名稱的單詞首字母必須大寫
private String name ; // 姓名,是一個字符串所以使用String
private int age ; // 年齡是一個整數(shù),所以使用int
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 void tell(){ // 定義一個方法
System.out.println("姓名:" + name + ",年齡:" + age) ;
}
}
public class ClassDemo {
public static void main(String args[]){
Person per = new Person() ;
per.setName("張三") ;
per.setAge(99999) ;
per.tell() ;
}
}
此時,雖然是通過setter和getter方法間接的訪問了私有屬性,但是卻沒有檢驗,一旦需要檢驗,則檢驗的操作應該放在setter語句之中。
所有的設置應該在setter中完成,而getter方法只是將內容簡單的返回即可。
class Person { // 類名稱的單詞首字母必須大寫
private String name ; // 姓名,是一個字符串所以使用String
private int age ; // 年齡是一個整數(shù),所以使用int
public void setName(String n){
name = n ;
}
public void setAge(int a){
if(a0 a200){
age = a ;
}
}
public String getName(){
return name ;
}
public int getAge(){
return age ;
}
public void tell(){ // 定義一個方法
System.out.println("姓名:" + name + ",年齡:" + age) ;
}
}
public class ClassDemo {
public static void main(String args[]){
Person per = new Person() ;
per.setName("張三") ;
per.setAge(99) ;
per.tell() ;
}
}
此時,就通過封裝性解決了設置錯誤內容的問題。
一定要注意的是,封裝性出了在屬性聲明上外,也可以在方法上聲明。
private void info(){ // 私有方法
System.out.println("*************************") ;
}
public void tell(){ // 定義一個方法
this.info() ;
System.out.println("姓名:" + name + ",年齡:" + age) ;
}
如果現(xiàn)在調用的是本類中的方法,可以通過“this.方法()”的形式訪問。
封裝在java中有兩種表現(xiàn)
1.用類封裝一個事物的屬性和方法。
2.用方法來封裝一個固定的算法。
樓上所說的其實是封裝的程度不一樣,在面向對象的術語中粒度來表示這個程度。
封裝其實是要看情況而定的,如果你這個類是描述人的,需要這個人完成一些基本的動作,如吃飯,走路,那么就不用把細胞也封裝進來。但是如果“人”這個類,需要做醫(yī)學的研究用,那么就需要封裝細胞這個屬性了。
代碼打多了就自然能理解了,不是一個復雜的概念。呵呵。
封裝:是指隱藏對象的屬性(成員變量)和實現(xiàn)細節(jié)(方法),僅對外提供公共訪問方式。
好處:
隱藏實現(xiàn)細節(jié),提供公共的訪問方式
提高了代碼的復用性
提高安全性。
封裝原則:
將不需要對外提供的內容都隱藏起來。
把屬性隱藏,提供公共方法對其訪問。
常見封裝 :
成員變量封裝---
private 數(shù)據(jù)類型 xxx ;
private關鍵字:
是一個權限修飾符。
可以修飾成員(成員變量和成員方法)
被private修飾的成員只在本類中才能訪問。
例如:
class show(){
private String name;//其他類無法訪問當前私有成員
public String getName(){//可以通過public修飾的方法訪問name
return this.name;
}
}
public class Man {
//這里是對屬性的封裝,一個人的姓名,年齡,妻子都是這個對象(人)的私有屬性
private String name;
private int age;
private Woman wife;
//這里是對改人對外界提供方法的封裝,可以設置改男人的妻子,姓名,年齡也可以獲取改男人的姓名和年齡
public void setWife(Woman wife) {
this.wife = wife;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
public class Woman {
//同樣這里是屬性封裝
private String name;
private int age;
private Man husband;
//方法封裝
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Man getHusband() {
return husband;
}
public void setHusband(Man husband) {
this.husband = husband;
}
}
/**
* 仔細看就會發(fā)現(xiàn),Man類沒有提供getWife的方法,這是以為男人不想讓自己的妻子被外界訪問,
*
* 直接下來呢,就是封裝可以吧一個對象的屬性私有,而提供一些可以被外界訪問的屬性的方法,
*
* 比如說,name屬性,Man和Woman類都有相應的get和set方法,外界都可以通過這些方法訪問和修改
*
* 同時對一些改對象不想讓外界訪問的屬性,就不提供其方法,比如說Man的wife屬性,就沒有get方法
*
* 外界是不能帶到Man類的wife屬性的
*
* 呵呵
* 奇怪的是Woman類有husband的get方法,這就是封裝的一點,還有的其他朋友也說到了
*/
private String sex; //性別 private int age; //年齡 private String job; //工作 //以后只要是設置值的時候 實例化這個類 //比如設置年齡 那么調用setAge(String age);方法 //傳入年齡值 注意前面是什麼類型 這里為int //TestBean test=new TestBean(); //String name="張三"; //test.setName(name); //設置值后 很復雜的多個屬性 便變成了一個簡單的JavaBean對象 //取值也很簡單 前提是你已經(jīng)設置了多項屬性的值 //比如調用年齡 getAge()就可以拿到年齡的值 //對應其類型 可以這樣調用 //TestBean test=new TestBean(); //String name=test.getName(); //使用JavaBean的好處有 實現(xiàn)MVC結構 //封裝多個屬性或對象為一個對象 私有的屬性 而共有的方法 大大提高程序安全性 //。。。等等
public?class?Student2?{
private?String?name;
private?String?age;
private?String?sex;
private?String?major;
public?Student2(String?name,?String?age)?{
super();
this.name?=?name;
this.age?=?age;
this.sex?=?"男";
this.major?=?"JAVA";
}
public?Student2(String?name,?String?age,?String?sex,?String?major)?{
super();
this.name?=?name;
this.age?=?age;
this.sex?=?sex;
this.major?=?major;
}
public?String?getName()?{
return?name;
}
public?void?setName(String?name)?{
this.name?=?name;
}
public?String?getAge()?{
return?age;
}
public?void?setAge(String?age)?{
this.age?=?age;
}
public?String?getSex()?{
return?sex;
}
public?void?setSex(String?sex)?{
this.sex?=?sex;
}
public?String?getMajor()?{
return?major;
}
public?void?setMajor(String?major)?{
this.major?=?major;
}
public?String?take()?{
return?"大家好,我叫"?+?name?+?",今年"?+?age?+?"歲,性別"?+?sex?+?",專業(yè)是"?+?major;
}
}
student2類
public?class?Student?{
/**
*?@param?args
*/
public?static?void?main(String[]?args)?{
//?TODO?Auto-generated?method?stub
Student2?s1?=?new?Student2("張三",?"18");
Student2?s2?=?new?Student2("李四",?"15",?"女",?"C++");
System.out.println(s1.take());
System.out.println(s2.take());
}
}
測試方法
結果:
大家好,我叫張三,今年18歲,性別男,專業(yè)是JAVA
大家好,我叫李四,今年15歲,性別女,專業(yè)是C++
你是要這個東西么