国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

黑馬程序員_Java面向對象1_封裝

2019-11-14 21:43:50
字體:
來源:轉載
供稿:網友
黑馬程序員_java面向對象1_封裝3.面向對象_封裝3.1面向對象概念3.1.1理解面向對象
  • 面向對象是相對面向過程而言
  • 面向對象和面向過程都是一種思想
  • 面向過程:強調的是功能行為(執行者)
  • 面向對象:將功能封裝進對象,強調具備了功能的對象(指揮者)
  • 面向對象是基于面向過程的
3.1.2面向對象的特點
  • 面向對象三個特征:封裝,繼承,多態。
  • 以后開發:其實就是找對象使用,沒有對象就創建一個對象。
  • 找對象,建立對象,使用對象,維護對象的關系。 
3.2類與對象的關系3.2.1 類與對象
  • 類和對象的關系:類就是對現實生活中事物的描述。對象就是這類事物實實在在存在的個體(通過new操作符所產生的一個實體,這個實體在堆內存當中)。
  • 映射到Java中,描述就是class定義的類
  • 具體對象就是對應Java在堆內存中用new建立實體。
  • 屬性對應是類中的變量,行為對應的類中函數(方法)。
  • 其實定義類就是在描述事物,就是在定義屬性和行為。,屬性和行為共同成為類中的成員(成員變量和成員方法)。
  • car c = new car();//c就是一個類類型變量。記住類類型變量指向對象。
  • 指揮對象:在Java智慧方式是:對象.對象成員()//c.color = "blue";c.run();
3.2.2 成員變量和局部變量
  • 成員變量作用于整個類中,局部變量作用于函數中,或者語句中。
  • 在內存中的位置:成員變量在對堆內存中,局部變量在棧內存中。
3.2.3 匿名對象

匿名對象是對象的簡化形式。(凡是簡化的都有局限性,例如三元運算符。)

匿名對象兩種使用情況:

  • 當對對象方法僅進行一次調用時。//new car().num = 5;如果對一個對象進行多個成員調用,必須給這個對象進行起個名字。
  • 匿名對象可以作為實際參數進行傳遞。//show(new Car());
3.3封裝
  • 封裝:是指隱藏對象的屬性和實現細節,僅對外提供公共訪問方式。
  • 好處:
    • 將變化隔離。
    • 便于使用。
    • 提高重用性。
    • 提高安全性。
  • 封裝原則:
    • 將不需要對外提供的內容都隱藏起來。
    • 把屬性都隱藏,提供公共方式對其訪問。(直接訪問會造成安全隱患//age=-20)
PRivate關鍵字
  • 私有,權限修飾符,用于修飾類中得成員變量和成員函數,私有只在本類中有效。
  • 將屬性私有化以后,類以外即使建立了對象也不能進行訪問,就在本類中提供對外的訪問方式,通常是set和get兩種。
  • 凡是set的返回值類型都是void,并帶參數。get類型與返回值一致,不帶參數。
  • 注意:私有僅僅是封裝的一種變現形式。
  • 之所以對外提供訪問方式,是因為可以在訪問方式中添加邏輯判斷等語句,對訪問的數據進行操作提高代碼的健壯性。
3.4構造函數

1、特點:

  1. 函數名與類名相同。
  2. 不用定義返回值類型。
  3. 不可以寫return語句。(void是一種返回值類型,代表沒有具體結果返回。)

2、作用:對象一建立就會調用與之對應的構造函數,給對象進行初始化。

3、注意:1、默認構造函數的特點 2、多個構造函數是以重載的形式存在的

4、構造函數的小細節:當一個類中沒有定義構造函數時,那么系統會默認給該類加入一個空參數的構造函數。當在類中自定義了構造函數后,默認的構造函數就沒有了。

5、構造函數和一般函數在寫法上有不同。在運行上也有不同:構造函數是在對象一建立就運行,給對象初始化。而一般方法是對象調用才執行,是給對象添加對象具備的功能。一個對象建立,構造函數只運行一次。而一般方法可以被對象調用多次。

6、什么時候定義構造函數呢?

當分析事物時,該事物存在具備一些特性或者行為,那么將這些內容定義在構造函數中。

7、構造代碼塊作用:給對象進行初始化,對象一建立就運行,而且優先于構造函數執行。//"{ }"什么都沒有,就一大括號。構造代碼塊中定義的是不同對象共性的初始化內容。

8、構造函數和構造代碼塊的區別:構造代碼塊是給所有對象進行初始化,構造函數是給對應對象進行初始化。

9、構造函數是可以被私有化的,一旦一個類中所有構造函數被私有化,就代表這個類不可能被創建對象。因為構造函數不能被初始化。

3.5this關鍵字

1、this是用于區分局部變量和成員變量同名的情況。

2、this代表她所在函數所屬對象的引用,哪個對象在調用this所在的函數,this就代表哪個函數。

3、應用:當定義類中功能時,該函數內部要用到調用該函數對象時,這時用this來表示這個對象。

4、this關鍵字在構造函數間調用//this.name = name this(name)=new person(name)

5、this語句只能定義在構造函數的第一行。//this();因為初始化要先執行,

3.6static(靜態)關鍵字3.6.1 static
  • static關鍵字
    • 是一個修飾符,用于修飾成員(成員變量(類變量)和成員函數)
  • 被修飾后的成員具備以下特點
    • 隨著類的加載而加載(靜態會隨著類的消失而消失,生命周期最長)
    • 優先于對象存在(存在方法區、共享區、數據區)
    • 被所有對象所共享
    • 可以直接被類名調用(類名.靜態成員)
  • 使用注意
    • 靜態方法只能訪問靜態成員
    • 靜態方法中不可以寫this、super等關鍵字
    • 主函數是靜態的

實例變量和類變量的區別:

  1. 存放位置:
    1. 類變量隨著累的加載而存在于方法區中。
    2. 實例變量隨著對象的建立而存放在堆內存中。
  2. 生命周期:
    1. 類變量生命周期最長,隨著類的消失而消失。
    2. 實例變量的生命周期隨著對象的消失而消失。

靜態有利有弊:利:對對象的共享數據單獨空間進行存儲,節省空間,沒有必要對每一個對象都存儲一份,可以直接被類名調用。弊端:生命周期過長。訪問出現局限,只能訪問靜態。

3.6.2 主函數:public staitic void main (String [] args)

主函數是一個特殊的函數,作為程序的入口,是固定格式的,可以被jvm調用。

主函數的特點:

  • public:代表著該函數訪問權限是最大的。
  • static:代表著主函數隨著類的加載就已經存在了。
  • void:主函數沒有具體的返回值。
  • main:不是關鍵字,是一個特殊的單詞,被jvm識別。
  • (String [] arr):函數的參數,參數類型是一個數組,該數組中的元素是字符串。字符串類型的數組。
  • jvm在調用主函數時,傳入的是new String [0]
  • D:/java0217/day06/java MainDemo haha hehe heihei//往主函數傳進三個參數。
3.6.3 靜態什么時候使用

要從兩方面下手:因為靜態修飾的有成員變量和成員函數。

什么時候定義靜態變量?

當對象中出現共享數據時,該數據被靜態所修飾。對象中的特有數據定義成非靜態存在于堆內存中。

什么時候定義靜態函數?

當功能內部沒有訪問到非靜態數據(對象的特有數據),那么該功能可以定義成靜態的。

靜態的應用:每一個程序中都有共性的功能,可以將這些功能進行抽取,獨立封裝,以便復用。

雖然可以通過ArrayTool的對象使用這些工具方法,對數組進行操作。發現了以下問題:

  1. 對象是用于封裝數據的,可是ArrayTool對象并未封裝特有數據。
  2. 操作數組的每一個方法都沒有用到ArrayTool對象中的特有數據。

這時就考慮,讓程序更嚴謹,是不需要對象的。可以將ArrayTool中的方法都定義成static的,直接通過類名調用即可。

將方法都靜態后,可以方便于使用,但是該類還是可以被其他程序建立對象的。為了更嚴謹,強制該類不能建立對象。可以通過將構造函數私有化完成。//private ArrayTool(){}

3.6.4 幫助文檔得制作javadoc

接下來,把javadoc.class文件發送給別其他人,其他人只要將該文件設置到classpath路徑下就可以使用該工具類,但是該類中到底定義了多少個方法,對方卻不清楚,因為沒有使用說明書。

開始制作程序的說明書,java的使用說明書由注釋來完成。/**這是一個對數組進行操作的工具類。*/

  • @auther 張三
  • @version v1.1

凡是用public修飾符修飾的功能都用文檔注釋,都可以被文檔注釋所提取。/**獲取一個整形數組中的最大值。@param arr 接受的是一個int類型的數組 @return 會返回一個該數組中的最大值。*/

格式:javadoc -d myhelp -auther -version (-d:目錄的意思 myhelp:有就入沒就建一個 -authe:作者 -version:版本)注意:類必須是public修飾符修飾,權限要足夠大。

默認構造函數的權限是隨著類的變化而變化的(注意不寫才是默認的構造函數!!)

API(application program interface 應用程序接口)

3.6.5 靜態代碼塊

格式: static{靜態代碼塊得執行語句。}

特點:隨著類的加載而執行,只執行一次,并優先于主函數,用于給類進行初始化的。(只有用到類中的內容類才會被加載。)

靜態代碼塊(給類進行初始化的)-->構造代碼塊(給對象進行初始化的)-->構造函數(給對應對象進行初始化的)

3.7 對象的初始化過程3.7.1person p = new person("zhangdan",20)

該句話都做了些什么?

  1. 因為new用到了Person.class文件,所以會先找到Person.class文件并加載到內存中。
  2. 執行該類中的static代碼塊,如果有的話,給Person.class類進行初始化。
  3. 在堆內存中開辟空間,分配內存地址。
  4. 在堆內存中建立對象的特有屬性,并進行默認初始化。
  5. 對屬性進行顯示初始化。
  6. 對對象進行構造代碼塊初始化。
  7. 對對象進行對應的構造函數初始化。
  8. 將內存地址付給棧內存中的p變量。
3.7.2對象調用成員過程p.setname("lisi")

棧里面會先開辟主函數的空間p,對內存里new了一個對象實體,把內存地址值傳給p,p.setname會在棧內存中開辟局部變量name的空間,每一個非靜態的方法都有自己所屬,為this的引用,方法被p調用,所以this的值為p的值,“lisi"就付給p對象的name。

  • 非靜態前面省略的是(this.),靜態前面省略的是(類名.)。
3.7單例設計模式

設計模式:解決某一問題最行之有效的方法。Java中有23種設計模式。

單例設計模式:解決一個類在內存中值存在一個對象。

想要保證對象唯一。

  1. 為了避免其他程序過多建立該類對象,先禁止其他程序建立該類對象。
  2. 還為了讓其他程序可以訪問到該類對象,在本類中自定義一個對象。
  3. 為了方便其他程序對自定義對象的訪問,可以對外提供一些訪問方式。

這三步怎樣用代碼去體現呢?

  1. 將構造函數私有化。
  2. 在類中創建一個本類對象。
  3. 提供一個方法可以獲取到該對象。

對于事物該怎么描述還怎么描述。對需要將該事物的對象保證在內存中的唯一時,就將以上的三步加上即可。

  • 餓漢式:對象先初始化,Single類一進內存,就已經創建好了對象。(s = new single)定義單例,建議使用餓漢式。
  • 懶漢式:對象式方法被調用時,才初始化的。也叫做對象的延時加載。Signle類進內存,對象還沒有存在。只有調用了getInstance方法時,才建立對象。(s = null) 缺點:當多個程序同時調用時會創建多個對象,不能保證對象的唯一性。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 鄂尔多斯市| 连江县| 桂林市| 吴忠市| 大关县| 泸定县| 山阴县| 望谟县| 金塔县| 广饶县| 苍溪县| 绥德县| 赤城县| 微博| 伊宁市| 城市| 白玉县| 南丹县| 黄梅县| 徐州市| 河北区| 仪陇县| 二连浩特市| 津南区| 虹口区| 澄城县| 宣威市| 大同市| 义乌市| 天门市| 海宁市| 萍乡市| 车险| 会理县| 勃利县| 桦甸市| 遂宁市| 玉门市| 巴彦淖尔市| 安丘市| 河源市|