面向對象一(封裝,構造函數,this,static,單例設計模式)

 

 一面向對象概念

 

 

1 理解面向對象
 (1) 面向對象是相對面向過程而言。
 (2)面向對象和麪對過程都是一種思想。
 (3)面向過程強調的功能行爲。
 (4)面向對象將功能封閉成對象,具備了功能的對象。
 (5)面向對象是基於面向過程的。
 (6)面向對象的三個特徵:封裝,繼承,多態。
 
2面向對象要點
(1)相對於過程,面向對象使問題更加簡單化。
(2)對象不只是指人,萬物皆可爲對象。
(3)面向對象使執行者變爲指揮者。
(4)開發時,先找對象,再找功能,找到了直接用。
(5)沒有對象時,創建對象再用。

2類與對象的關係 
(1)類:對現實生活中的事物的描述 (對象的抽象)
(2)對象:就是這類事物實實在在的個體(類的實例)
3.main函數
public static void main(String[] args)

 public :代表着該函數的訪問權限是最大的。
 static :主函數是靜態的,代表主函數隨着類的加載就已經存在。
 void  :主函數的返回值沒null 沒有具體返回值。
  main:不是關鍵字,但是一個特殊的詞,可以被jvm所識別。
 (String[] args) 函數的參數,參數類型是一個數組,該數組中的元素是字符串,JVM在調用主函數時,傳入的是new String[0];

4 成員變量和局部變量
 (1)作用範圍
  成員變量作用於整個類中
  局部變量作用於函數中,或者語句中。
  
  (2)在內存中的位置:
  成員變量:在堆內存中,因爲對象的存在纔在內存中存在。
  局部變量:在棧內存中。
  
  (3)main函數注意點:
  在類中寫主函數代表該類可獨立運行
  可在本類中創建本類對象,但一般不這樣做。

 5 匿名對象  

 (1)匿名對象是對象的簡化形式。
  (2)匿名對象調用屬性沒意義,調用方法有意義,因爲方法裏有內容。
  (3)匿名對象兩種使用情況:
  <1>當對對象方法僅進行一次調用時。如:new Car().run();
  <2>作爲實際參數進行傳遞時。
  (4)代碼演示:
   public static void main(String[] args)
  {
       show(new Car());
  }
  public static void show(Car c)
  {
       c.num = 3;
       c.color = "black";
       c.run();
  } 

   (5)注意:
   <1>當對一個對象進行多個成員調用時,就必須給這個對象起個名字。
   <2>匿名對象作參數,show方法執行完,對象就釋放內存。

 

二 封裝 

 

 

 

  1封裝概述 
 (1): 指隱藏對象的屬性和實現細節,僅對外提供公共訪問方式。
  (2)好處:
  將變化隔離
  便於使用
  提高重用性 
  提高安全性
  (3)封裝原則 :
  將不需要的對外提供的內容都隱藏起來。
  把屬性都隱藏,提供公共方法對其訪問。
 (4) 函數,類,包 和框架 都是封閉體。

 2 封裝private

(1) private關鍵字

private是一個權限修飾符。用於修飾成員(成員變量和成員函數,內部類)  被私有化的成員只有在本類中有效。

(2)要點說明:

<1>將成員變量私有化, 對外提供對應的set,get方法對其進行訪問,提高對數據訪問安全性。

<2>將屬性私有化以後,類以外即使建立了對象也不能直接訪問。

<3>私有僅僅是封裝的一種表現形式,權限在訪問不到的範圍內都是封裝。

<4>在訪問方式中可加入邏輯判斷語句,提高代碼健壯性。

 

 

三 構造函數 

 

1 特點:

 (1) 函數名與類名相同

(2)不用定義返回值類型

(3)不可以寫return語句

2 作用:給對象進行初始化

3 注意: 

(1)對象一建立就會調用 與之相對應的構造函數。若訪問不到相應的構造函數,則對象不能建立。

(2)當一個類中沒有定義構造函數時, 系統會默認給該類加入一個空參數的構造函數。

(3)在類中自定義了構造函數後,默認的構造函數就沒有了。

(4)多個構造函數是以重載的形式存在的。

4.構造函數與一般函數的區別:

(1)構造函數是在對象一建立就運行,而一般方法是對象調用才運行。

 (2) 一個對象建立,構造函數只運行一次,而一般方法可多次被調用。

5 何時定義構造函數?

 (1) 當分析事物時, 該事物具備一些特性或行爲,那麼將這些內容定義在構造函數中。

6.構造代碼塊。

(1)作用:給對象進行初始化。對象一建立就運行,並且優先於構造函數執行。

(2)和構造函數的區別:

構造代碼塊是給所有對象進行統一初始化

構造函數是給所對應的對象進行初始化。

(3) 構造代碼塊中定義的是不同對象共性的初始化內容。

 

四 this 關鍵字 

 

 

1. this關鍵字 

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

this代表它所在函數所屬對象的引用。

哪個對象在調用 this所在的函數,this就代表哪個對象。

2.this的應用 

(1) 當定義類中的功能時,該函數內部要用到調用 該的對象時, 這時用this來表示這個對象。

(2)但凡本類功能內部使用了本類對象,都使用this來表示。

3 代碼示例:

class Person

{

private int age;

Person(int age)

{

this.age = age;

}

public boolean compare(Person p)

{

return this.age == p.age;

}
}
 

}

 

3.this在構造函數間的調用 

(1)this的調用 

<1>this語句: 用於構造函數之間進行互相調用 。

<2>this語句只能定義在構造函數的第一行,因爲要初始化要先執行。

 

(2)this的兩種用法:

<1>用於區分同名變量的情況。

<2>用於構造函數間調用 ,一般函數是不能直接調用構造函數的。

(3)代碼演示:

class Person

{

private String name;

private int age;

Person()

{

System.out.println("hello");

}

Person(String name)

{

this();

this.name = name;

}

Person(String name,int age)

{

this(name);//構造函數間的相互調用 

this.age = age;

}
}

}

 

五 static 關鍵字

 

 

 

1.用法:

(1)是一個修飾符 ,用於修飾成員(成員變量和成員函數,內部類)

 (2) 當成員被靜態修飾後,就多了一個調用方式,除了被對象調用外,還可以直接被類名調用,格式:類名.靜態成員。

2 static 特點:

(1)隨着類的加載而加載。

(2)優先於對象存在。

(3)被所有的對象所共享。

(4)可直接被類名調用 。

3.實例變量和類變更的區別:

(1)存放位置:

 類變量隨着類的加載而存放於方法區中。

 實例變量隨着對象的加載而存放於堆內存中。

(2)生命週期:

類變量生命週期長,隨着類的消失而消失。

實例變量生命週期隨着對象的消失而消失。

4.靜態使用注意事項:

靜態方法只能訪問靜態成員。非靜態方法即可以訪問靜態也可以訪問非靜態。

靜態方法只不可以定義this super關鍵字。因爲靜態優先於對象,所以靜態方法中不可以出現this.

5 靜態的利與弊:

(1)利:

節省空間。

可直接被類名調用。

(2)弊:

生命週期過長。

訪問出現侷限性。(靜態雖好,只能訪問靜態)

6.什麼時候使用靜態

(1)什麼時候定義靜態變量(類變量)

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

(2)什麼時候定義靜態函數

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

7.靜態代碼塊:

(1)格式:

static

{

靜態代碼塊中的執行語句;

}

(2)特點:

隨着類的加載而執行,只執行一次,並優先於主函數執行,用於給類進行初始化。

 

六 對象的初始化過程

 

 

 

Person p = new Person("lisi",20);該句話都做了什麼?

(1)因爲new用到了Person.class,所以會先找到Person.class文件並加載到內存中。

(2)執行該類中的static代碼塊,如果有的話,給Person.class類進行初始化。

(3)在堆內存中開闢空間,分配內存地址。

(4)在堆內存中建立對象的特有屬性,並進行默認初始化。

(5)對屬性進行顯示初始化。

(6)對對象進行構造代碼塊初始化。

(7)對對象進行對應的構造函數初始化。

(8)將內存地址賦給棧內存中的引用變量p。

 

七 製作幫助文檔

 

 

 

(1)幫助文檔就是類的說明書,可幫助更好地使用類和程序。

(2)製作幫助文檔使用的是javadoc.exe工具

F:\haima>javadoc -d myhelp -author -version ArrayTool.java

(3)注:

<1>凡是public修飾的功能都用文檔註釋來描述,因爲都可以被文檔註釋工具所提取。

<2>只有public和protect修飾的類纔可被提取生成文檔。

<3>類中默認的構造函數的權限和所屬類一致。且默認構造函數的權限是隨着

類的變化而變化的。

 

八 單例設計模式

 

 

 

1.設計模式

(1)設計模式:解決某一類問題最行之有效的方法。java中有23種設計模式。

(2)單例設計模式:解決一個類在內存中只存在一個對象的問題。

 

2.單例設計的思想與步驟:

(1)將構造函數私有化。

(2)在類中創建一個本類對象。

(3)提供一個方法可以獲取到該對象。

 

3.單例設計模式方式一:餓漢式(開發一般用這個)

代碼示例:

class Single

{

private Single(){}

private static final Single s = new Single();

public static Single getInstance(){

return s;

}

}

 

4:單例設計模式方式二:懶漢式

 (1)對象是方法被調用時,才初始化 也叫對象的延遲加載。

Single類進內存,對象還沒有存在。只有調用了getInstance方法才建立對象

代碼示例:

class Single

{

private staitc Single s =  null;

        private Single(){}

public static Single getInstance()

        {

        if(s == nul)

s = new Single();

                  return s; 

       }

}

 

實例的延遲加載,多線程訪問時會出現安全問題。使用判斷優化如下:

public static Single getInstance()

{

if(s == null)

{

 synchronized(Single.class)

{

if(s == null)

                                s = new Single();

}

}

return s;

}

 

 

 

 

 

 

 

 

 

 

 

   

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章