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