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