Java基础11-封装(思想、访问权限、this、构造方法)
?
一、什么是封裝呢?
封裝是面向對象的三大特征之一。
隱藏對象的屬性和實現細節,僅對外提供公共的訪問方式。
①封裝就是將面對對象的狀態和行為看成是一個整體,將二者存放在一個獨立的模塊中,比如說類
②封裝也是信息隱藏,把不需要讓外界知道的信息隱藏起來,盡肯能隱藏對象功能實現細節,向外暴露方法,保證外界的安全訪問,比如說方法
public static void SaveMan(int PhoneNumber,String name,int QQnumber,String Email,String wechant) {//我們在添加聯系人時,需要傳進的數據非常多而且很長,這就導致了參數列表的冗長 } class LinkMan{int PhoneNumber;String name;int QQnumber;String Email;String wechant;//這樣我們就將聯系人信息封裝起來了,封裝到了一個類里 }二、為什么要封裝呢?
1.我們先來看下邊這段代碼
public class FengZhuang { public static void main(String[] args) {Person p=new Person();p.name="asa";p.age=-17; //設置年齡的時候負數不合理,應該判斷輸入值是否正常//這個值是可以通過圓點運算符.來進行存取修改的,設置的數據不安全 }} class Person{String name;int age; }那我們怎么解決上述問題呢?
class Person{String name;//將年齡用權限修飾符設置為私有的,只能在本類中訪問,外界無法訪問。//既然我們已經將年齡設置成私有的,外界無法訪問,那我們怎么去設置它的值呢?//我們專門給age提供一個公共的方法,來對他進行訪問,這就是Setter和Getter方法private int age;public int getAge() {return age;}//我們可以通過set方法來對age進行訪問,并且對傳入的數據進行了篩選,這樣就提高了數據的安全性public void setAge(int age) {if(age<0) {System.out.println("年齡不能為負數");return;//結束程序}else {this.age = age;}} } public class FengZhuang { public static void main(String[] args) {Person p=new Person();p.setAge(-18); }當我們輸入一個負數年齡時,系統會給我們返回一個提示,提示我們不能是負數,但是我們并不知道它是怎么返回來的值,怎么去判斷的這些細節,我們只知道結果。
①封裝提高了代碼的安全性。
②隱藏了實現細節,對外提供可以訪問的方式。便于調用者的使用。
③提高了代碼的復用性。
?三、權限訪問修飾符
封裝讓有些類看不到一些類里邊具體做了什么,所以java提供了訪問權限修飾符來一個類里邊可以看到什么暴露什么,不可以看到什么暴露什么。
java中有四種訪問權限修飾符,分別是private私有的,default不寫,protected受保護的,public公共的
他們的訪問權限如下
| ? | public | protected | default | private |
| 同一類中 | √ | √ | √ | √ |
| 同一包中(子類與無關類) | √ | √ | √ | ? |
| 不同包的子類 | √ | √ | ? | ? |
| 不同包中的無關類 | √ | ? | ? | ? |
注意:private只能在本類中訪問,離開本類后不能直接訪問,在其他類中是可以訪問但不能直接訪問,比如上邊代碼中的set和get方法就是一種間接訪問private修飾符的字段方法
一般字段都是使用private修飾符來修飾,達到隱藏和安全的要求。
2.那么什么情況該用什么修飾符呢?
從作用域來看,public能夠使用所有的情況。 但是又不會真正全部都使用public,那么到底什么情況該用什么修飾符呢?
1. 屬性通常使用private封裝起來
2. 方法一般使用public用于被調用
3. 會被子類繼承的方法,通常使用protected
再就是作用范圍最小原則
簡單說,能用private就用private,不行就放大一級,用package,再不行就用protected,最后用public。 這樣就能把數據盡量的封裝起來,沒有必要露出來的,就不用露出來了
四、this關鍵字
現在有一輛自行車,小雨和小穎分別騎了一會這輛自行車,小雨說,這輛車我騎起來真重,那么當前“我”即這輛車的使用者就是小雨,小穎說,我騎起來還好,那么當前“我”即這輛車的使用者就是小穎。this就相當于我這個字,代表的是當前對象。
class Person{String name;private int age;public int getAge() {return age;}public void setAge(int n) {if(n<0) {System.out.println("年齡不能為負數");return;}else { //這里的n具體指什么呢?age = n;}} }n指我們要傳入的age,當我們把它換成age
class Person{String name;private int age;public int getAge() {System.out.println(age);return age;}public void setAge(int age) {if(age<0) {System.out.println("年齡不能為負數");System.out.println(age);return;}else {System.out.println(age);age = age;System.out.println(age);}} }我們看到如上的輸出結果,這表明get方法中的age獲取到的是成員變量中的age,默認賦值0,這是因為程序遵循就近原則。
那怎么解決呢?
當成員變量和局部變量同名時,就可以用this關鍵字來區分,誰調用這個函數this就指的誰。
class Person{String name;private int age;public int getAge() {System.out.println(age);return age;}public void setAge(int age) {if(age<0) {System.out.println("年齡不能為負數");System.out.println(age);return;//結束程序}else {System.out.println(age);this.age = age;System.out.println(age);}} } public static void main(String[] args) {Person p=new Person();p.setAge(18);System.out.println(p.getAge());Person p2=new Person();p2.setAge(20);System.out.println(p2.getAge()); }程序輸出結果如上圖,當p對象調用時this就指的p這個對象,p2調用時this指的p2這個對象
那程序不是就近原則嗎?為什這里的get方法獲取到了我們傳的這個值呢?
?五、構造方法
1.什么是構造方法?它有什么作用?
構造方法是一種特殊的方法,它是一個與類同名且返回值類型為同名類類型的方法。對象的創建就是通過構造方法來完成
其功能主要是完成對象的初始化。當類實例化一個對象時會自動調用構造方法。構造方法和其他方法一樣也可以重載。
class Person{String name;int age;//無參構造,會默認就有,只是隱藏了我們看不見public Person() {super();} }?
在Java中,任何變量在被使用前都必須先設置初值.Java提供了為類的成員變量賦初值的專門方法。
java中創建對象時會調用類的構造方法,如果我們不重寫這個構造方法,它默認的是一個無參數的構造方法
2.實例化對象
當我們重寫這個構造方法后再實例化對象
如果我們不傳值,編譯器會報錯。
當我們也將無參構造寫出來后,便可以不在實例化時就傳值
?內存圖解
?
3.特殊性
1.構造方法作用:(1).構造出來一個類的實例 (2).對構造出來個一個類的實例(對象)初始化。 2.構造方法的名字必須與定義他的類名完全相同,沒有返回類型,甚至連void也沒有。 3.主要完成對象的初始化工作,構造方法的調用是在創建一個對象時使用new操作進行的。 4.類中必定有構造方法,若不寫,系統自動添加無參構造方法。接口不允許被實例化,所以接口中沒有構造方法。 5.不能被static、final、synchronized、abstract和native修飾。 6.構造方法在初始化對象時自動執行,一般不能顯式地直接調用.當同一個類存在多個構造方法時,java編譯系統會自動按照初始化時最后面括號的參數個數以及參數類型來自動一一對應。完成構造函數的調用。 7.構造方法分為兩種:無參構造方法 有參構造方法 構造方法可以被重載。沒有參數的構造方法稱為默認構造方法,與一般的方法一樣,構造方法可以進行任何活動,但是經常將他設計為進行各種初始化活動,比如初始化對象的屬性。?8.自定義類中,如果不寫構造方法,java系統會默認添加一個無參的構造方法。如果寫了一個有參的構造方法,就一定要寫無參構造方法。
?
轉載于:https://www.cnblogs.com/LuckyGJX/p/8907735.html
總結
以上是生活随笔為你收集整理的Java基础11-封装(思想、访问权限、this、构造方法)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: stm32f10x单片机进阶--spi使
- 下一篇: Java 日期与时间