封裝 (encapsulation) 隱藏對象的屬性和實現(xiàn)細節(jié),僅對外公開接口,控制在程序中屬性的讀取和修改的訪問級別簡言之,就是把對象保護起來不讓對象(你)之間訪問到,然后呢?當(dāng)然為了你的訪問會給你提供接口供你訪問比如setter和getter方法 封裝方法 在需要封裝的變量前加修飾詞 private 下面就舉一個簡單的例子 ——————————————————————————————————————————————————————————------ 例1 class Person { private String name; private int age; public void setName(String name) { this.name=name; } public void setAge(int age) { this.age=age; } public String getName() { return name; } public int getAge() { return age; } } class Demo { public static void main(String args[]) { Person p=new Person(); p.setName("雪飛揚"); p.setAge(20); System.out.println(p.getName()+","+p.getAge()); } } 輸出結(jié)果:雪飛揚,20 _________________________________________________________________________________________________________ 為什么要封裝? 那必須是為了安全啊,你想啊你買了一臺電腦,沒有主機箱直接放在那里你敢用嗎?電腦容易進水壞了是小事,你要是那個啥有個萬一………是不是。 以上面的例子為例如果上面年齡傳入了-20,那么會直接輸出年齡-20歲,這顯然是不科學(xué)的,對數(shù)據(jù)來說是不安全的。所以呢 輸出結(jié)果:雪飛揚,-20 這顯然不是我們想要的結(jié)果,如果沒有進行數(shù)據(jù)的封裝,我們沒有辦法解決這個問題,但是我們現(xiàn)在進行了封裝,我們可以很簡單的解決這個問題 例2 class Person { private String name; private int age; public void setName(String name) { this.name=name; } public void setAge(int age) { this.age=age; } public String getName() { return name; } public int getAge() {if (age>0&&age<130) return age; else System.exit(1); } } class Demo { public static void main(String args[]) { Person p=new Person(); p.setName("雪飛揚"); p.setAge(-20); System.out.println(p.getName()+","+p.getAge()); } } 輸出結(jié)果:您輸入的年齡信息有誤,請重新輸入后操作 這樣就提高了數(shù)據(jù)的安全性,提高了代碼的健壯性 ———————————————————————————————————————————————————————————— 當(dāng)然,以上是大多數(shù)書本上都會提到的內(nèi)容,不多說。下面咱們晚點其他的。 既然成員變量被私有化了,我們想要用到他們是否一定要用到setter和getter方法呢? 答案可定時否定的,接下來我們就看看其他方法 例3 class Demo { } } class Person { private String name; private int age; Person(String name,int age){//構(gòu)造函數(shù)初始化,相當(dāng)于setName和setAge方法 this.name=name; this.age=age; } public String toString()//復(fù)寫toString方法,返回年齡和姓名信息,相當(dāng)于getAame和getAge方法 { return this.name+","+this.age(); } } 輸出結(jié)果:雪飛揚,20 ———————————————————————————————————————————————————————————— 構(gòu)造函數(shù)??? 好吧,在這里再給大家說說構(gòu)造函數(shù) 什么事構(gòu)造函數(shù)? 所謂構(gòu)造函數(shù),就是構(gòu)造對象的函數(shù),就是創(chuàng)建對象的函數(shù) 構(gòu)造函數(shù)有什么特點? 1.隨著類的建立而出現(xiàn),默認為空,用戶可以自己定義構(gòu)造函數(shù) 2.構(gòu)造函數(shù)不能有return語句,不用寫返回值。 3.構(gòu)造函數(shù)在對象建立時調(diào)用有且僅有的一次。 4.構(gòu)造函數(shù)用于對象的初始化。 舉個例子: 例4 class Person{ public Person() { System.out.println("我出生了****"); } } class Demo { public static void main(String args[]) { Person p=new Person(); } } 輸出結(jié)果:我出生了**** 大家是不是有點覺得這段代碼不可思議,就創(chuàng)建了一個對象,怎么就出現(xiàn)了輸出語句呢? 這就是構(gòu)造函數(shù)完成的,它定義了函數(shù)初始化的值 大家明白了這個原理,上面封裝的例子就不難理解了。 ———————————————————————————————————————————————————————————— 什么還有toString() ? toString()方法隸屬于Object類,而所有的類都繼承Object類,也就是說所有的類都具有這個方法 ,所有的對象都可以調(diào)用這個方法。 例5 public class A{ public String toString(){return "this is A";} } 如果某個方法里面有如下句子: A obj=new A(); System.out.println(obj); 輸出結(jié)果:this is A 它通常只是為了方便輸出,比如System.out.println(xx),括號里面的“xx”如果不是String類型的話,就自動調(diào)用xx的toString()方法 它只是sun公司開發(fā)java的時候為了方便所有類的字符串操作而特意加入的一個方法。 依然以上面的例子為例 例6 class Demo { } } class Person { private String name; private int age; Person(String name,int age){//構(gòu)造函數(shù)初始化,相當(dāng)于setName和setAge方法 this.name=name; this.age=age; } } 輸出結(jié)果:Person@5ac2480b 沒錯大家看到的是一個Person對象的地址 那么當(dāng)我們復(fù)寫了ToString類之后呢?代碼同例3 輸出結(jié)果:輸出結(jié)果:雪飛揚,20 好了總結(jié)三句話 私有是封裝實現(xiàn)方式的一種,實現(xiàn)封裝有多種方式。 封裝可以提高代碼的安全性和健壯性。 封裝可以用setter和getter方法進行訪問。 封裝中的setter和setter方法可以用構(gòu)造函數(shù)和復(fù)寫toString方法代替。 封裝只能修飾成員變量和成員函數(shù)。 說道做到,三句就三句,絕不多說。 |
|
來自: 岑經(jīng)滄海難為水 > 《JAVA》