面向對象

                                                 面向對象

3.1面向對象概念

•1、面向對象時相對面向過程而言
2、面向對象和麪向過程都是一種思想
3、面向過程 強調的是功能行爲
4、面向對象 將功能封裝進對象,強調具備了功能的對象
5、面向對象時基於面向過程的
6、面向對象特徵:封裝、繼承、多態

3.2類與對象的關係

1、類就是對現實生活中事物的描述
2、對象就是這類事物,實實在在的個體

3、成員變量:作用於整個類中,成員變量在對內存中,因爲對象的存在,纔在內存中存在
局部變量:作用於函數或者語句中,局部變量在棧內存中
4、匿名對象:匿名對象是對象的簡化形式,有兩種使用情況
    1、當對對象方法僅進行一次調用時,只有調用方法纔有意義
    2、匿名對象可以作爲實際參數進行傳遞
    3、如果對一個對象的多個成員進行調用,必須給對象起名
           new Car();就是一個匿名對象

3.3封裝

1、封裝:是指隱藏對象的屬性和實現細節,僅對外提供公共訪問方式
2、好處:將變化隔離、便於使用、提高重用性、提高安全性
3、封裝原則:將不需要對外提供的內容都隱藏起來,把屬性都隱藏,提供公共方法對其訪問
4、privare:私有,權限修飾符:用於修飾類中的成員(成員變量和成員函數),私有隻在本類中有效
      注:私有僅僅是封裝的一種表現形式
5、一個成員變量通常都會對應兩個訪問方式 get set。
6、之所以對外提供訪問方式,就是因爲可以在訪問方式中加入邏輯判斷語句,對訪問的數據進行操作,提高代碼健壯性

3.4構造函數

1、特點:函數名與類名相同
      不用定義返回值類型
      可以不寫return語句
2、作用:給對象進行初始化, 對象已建立就會調用與之對應的構造函數

3、默認構造函數的特點:當一個類中沒有定義構造函數時,那麼系統會默認給該類加入一個空參數的構造函數 Person(){}。當在類        中自定義了構造函數,默認構造函數就沒有了
4、多個構造函數是以重載的形式存在的
5、構造函數與一般方法的不同之處:構造函數是在對象已建立就運行,給對象初始化,而一幫方法是對象調用才執行,是給對象添       加對象具備的功能。一個對象建立,構造函數只運行一次,而一般方法可以被該對象調用多次。
6、構造代碼塊:在類中定義一個空名的函數 例如直接寫個打印語句:。。。。。{ System.out.print(“初始化”)}。而且每一個構造         函數一建立的時候都先優先打印這個語句。
  1) 特點:對象一建立就運行,而且優先於構造函數執行
  2) 和構造函數的區別:構造代碼塊是給所有對象進行統一初始化,構造函數是給對應的對象進行初始化

3.5 this關鍵字

1、用於區分成員變量和局部變量同名的問題 例如:this.name(成員變量的name) = name(局部變量傳進來的name)
2、this 代表本類的對象。This代表它所在函數所屬對象的引用,簡單說哪個對象在調用this所在的函數,this就代表哪個對象
3、this應用:當定義類中函數功能時,該函數內部要調用到該函數的對象時,這時用this來表示這個對象。但凡本類功能內部使用了       被對象,都用this表示。
4、this語句 this();:用於構造函數間互相調用,只能放在構造函數的第一行,因爲初始化要先執行

3.6 static關鍵字

1、用於修飾成員(成員變量和成員函數

2、被修飾後的成員具備以下特點
      隨着類的加載而加載,存儲在方法區。也會隨着類的消失而消失
      優先於對象存在
      被所有對象所共享
      可以直接被類名調用 格式:類名.靜態成員

3、靜態(類)變量與實例(非靜態)變量的區別
1)存放位置:類變量隨着類的加載而存在於方法區,實例變量隨着對象的建立而存在於堆內存區
2)生命週期:類變量生命週期最長,隨着類的消失而消失,實例變量生命週期隨着對象的消失而消失。

4、使用注意
      靜態方法只能訪問靜態成員;非靜態方法既可以訪問靜態也可以訪問非靜態
      靜態方法中不可以寫this、super關鍵字,因爲靜態優先於對象存在
     主函數是靜態的

5、靜態有利有弊
     利:對對象的共享數據進行單獨空間存儲,節省空間。沒有必要每一個對象都存儲一份,可以直接被類名調用
     弊:生命週期過程,訪問有侷限性。(靜態雖好,只能訪問靜態)

6、主函數:是一個特殊的函數,作爲程序入口,可以被jvm(java虛擬機)調用
      定義:public 代表着該函數訪問權限是最大的
     static 代表主函數隨着類的加載而加載
     void 主函數沒有返回值
     mian 不是關鍵字,但是是一個特殊的單詞,可以被jvm識別
  (String[] arr)函數的參數,參數,參數類型是一個數組,該數組中的元素時字符串,字符串類型數組。
     主函數是固定格式:jvm識別
      Jvm在調用主函數時,傳入的new String[0]
7、什麼時候使用靜態? 從兩方面下手,因爲靜態修飾的內容有成員變量和函數
     1)什麼時候定義靜態變量

           當對象中出現共享數據時,該數據被靜態所修飾。對象中的特有數據要定義成非靜態存在於堆內存中
     2)什麼時候定義靜態函數
           當功能內部沒有訪問到非靜態數據(對象的特有數據),那麼該功能可以定義成靜態的

靜態實例應用:數組工具的封裝

[java] view plain copy
  1. /* 
  2. 靜態的應用: 
  3. 每個應用程序中都有共性的功能, 
  4. 以便將這些功能進行抽取,獨立封裝,以便複用,如下面的class ArrayTool 
  5.  
  6. 雖然可以通過建立ArrayTool的對象使用這些工具方法,對數組進行操作。 
  7. 發現了問題: 
  8. 1:對象適用於封裝數據的,可是ArrayTool對象並未封裝特有數據。 
  9. 2:操作數組的每一個方法都沒有用到ArrayTool對象中的特有數據。 
  10.  
  11. 這時就考慮,讓程序更嚴謹,是不需要對象的。 
  12. 可以講ArrayTool中的方法定義成static的。直接通過類名. 方法名稱即可。 
  13.  
  14. 將方法都靜態後,可方便於使用,但是該類還是可以被其它程序建立對象的。 
  15. 爲了更爲嚴謹,強制讓該類不能建立對象。 
  16. 可以通過將構造函數私有化完成。 
  17.  
  18. 接下來,將ArrayTool。class文件發送給其他人,其他人只要將該文件設置到classpath路徑下,就可以使用該類工具。 
  19.  
  20. 但是很遺憾,該類中到底有多少個方法,對方卻不清楚,因爲該類並沒有使用說明。 
  21.  
  22. 開始製作程序的說明書。java的說明書通過文檔註釋來完成。 
  23. */  
  24. /** 
  25. 這是一個可以對數組進行操作的工具,該類提供了,獲取最值、排序等功能。 
  26. @author 關軍波 
  27. @version v1.1 
  28.  
  29. */  
  30. public class ArrayTool  
  31. {  
  32.     /** 
  33.     空參數構造函數。 
  34.     */  
  35.     private ArrayTool(){}//構造函數私有化  
  36.   
  37.     /** 
  38.     獲取一個整形數組中的最大值。 
  39.     @param arr 接收一個int類型的數組。 
  40.     @return 會返回一個該數組中最大值。 
  41.     */  
  42.     public static int getMax(int[] arr)//取數組最大值  
  43.     {  
  44.         int max=0;  
  45.         for (int x=1;x<arr.length ;x++ )  
  46.         {  
  47.             if(arr[max]<=arr[x])  
  48.             {  
  49.                 int temp=arr[max];  
  50.                 arr[max]=arr[x];  
  51.                 arr[x]=temp;  
  52.             }  
  53.               
  54.         }  
  55.         return arr[max];  
  56.     }  
  57.   
  58.     /** 
  59.     獲取一個整形數組中的最小值。 
  60.     @param arr 接收一個int類型的數組。 
  61.     @return 會返回一個該數組中最小值。 
  62.     */  
  63.     public static int getMin(int[] arr)//取數組最小值  
  64.     {  
  65.         int min=0;  
  66.         for (int x=1;x<arr.length ;x++ )  
  67.         {  
  68.             if(arr[min]>=arr[x])  
  69.             {  
  70.                 int temp=arr[min];  
  71.                 arr[min]=arr[x];  
  72.                 arr[x]=temp;  
  73.             }  
  74.         }  
  75.         return arr[min];  
  76.     }  
  77.   
  78.     /** 
  79.     給int數組進行選擇排序 
  80.     @param arr 接收一個int類型的數組。 
  81.      
  82.     */  
  83.     public static void selectSort(int[] arr)//數組選擇排序  
  84.     {  
  85.         for (int x=0;x<arr.length-1 ;x++ )  
  86.         {  
  87.             for (int y=x+1;y<arr.length ;y++ )  
  88.             {  
  89.                 /*if(arr[x]>=arr[y]) 
  90.                 { 
  91.                     int temp=arr[x]; 
  92.                     arr[x]=arr[y]; 
  93.                     arr[y]=temp; 
  94.                 }*/  
  95.                 swap(arr,x,y);  
  96.             }  
  97.               
  98.         }  
  99.         printArray(arr);  
  100.         /* 
  101.           System.out.print("[ "); 
  102.           for (int x=0;x<arr.length ;x++ ) 
  103.           { if(x!=arr.length-1) 
  104.                 System.out.print(arr[x]+" "); 
  105.             else 
  106.                 System.out.println(arr[x]+" ]"); 
  107.           } 
  108.         */  
  109.           
  110.     }  
  111.   
  112.     /** 
  113.     給int數組進行冒泡排序 
  114.     @param arr 接收一個int類型的數組。 
  115.      
  116.     */  
  117.     public static void bubbleSort(int[] arr)  
  118.     {  
  119.         for (int x=0;x<arr.length-1 ;x++ )  
  120.         {  
  121.             for (int y=0;y<arr.length-x-1 ;y++ )  
  122.             {  
  123.                 /*if(arr[y]>arr[y+1]) 
  124.                 { 
  125.                     int temp=arr[y]; 
  126.                     arr[y]=arr[y+1]; 
  127.                     arr[y+1]=temp; 
  128.                 }*/  
  129.                 swap(arr,y,y+1);  
  130.             }  
  131.         }  
  132.         printArray(arr);  
  133.         /* 
  134.           System.out.print("[ "); 
  135.           for (int x=0;x<arr.length ;x++ ) 
  136.           { if(x!=arr.length-1) 
  137.                 System.out.print(arr[x]+" "); 
  138.             else 
  139.                 System.out.println(arr[x]+" ]"); 
  140.           } 
  141.         */  
  142.       }  
  143.   
  144.      /** 
  145.       用於打印數組中的元素。打印形式是:[element1 element2 ...] 
  146.      */  
  147.      public static void printArray(int[] arr )  
  148.     {     
  149.         System.out.print("[ ");  
  150.         for (int x=0;x<arr.length ;x++ )  
  151.         {   if(x!=arr.length-1)  
  152.                 System.out.print(arr[x]+" ");  
  153.             else  
  154.                 System.out.println(arr[x]+" ]");  
  155.         }  
  156.     }  
  157.     /** 
  158.     給數組中的元素進行位置的置換。 
  159.     @param arr 接收一個int類型的數組。 
  160.     @param a 要置換的位置 
  161.     @param b 要置換的位置 
  162.     */  
  163.     private static  void swap(int[] arr,int a,int b)//內部調用可以私有化  
  164.     {  
  165.         if(arr[a]>arr[b])  
  166.             {  
  167.                 int temp=arr[a];  
  168.                 arr[a]=arr[b];  
  169.                 arr[b]=temp;  
  170.             }  
  171.     }  
  172.   
  173. }  

封裝功能,製作java程序說明書




要求:獲取數組中的最大值、最小值並用選擇排序和冒泡排序對數組進行排序        

[java] view plain copy
  1. {2,1,4,7,8,3,1}  

思路:上面已將數組的這些功能進行了封裝,我們只需調用即可

[java] view plain copy
  1. class ArrayToolDemo   
  2. {  
  3.     public static void main(String[] args)   
  4.     {  
  5.         int[] arr=new int[]{2,1,4,7,8,3,1};  
  6.           
  7.         int max=ArrayTool.getMax(arr);  
  8.         System.out.println("max="+max);  
  9.         int min=ArrayTool.getMin(arr);  
  10.         System.out.println("min="+min);  
  11.         ArrayTool.selectSort(arr);  
  12.         System.out.println();  
  13.         ArrayTool.bubbleSort(arr);  
  14.     }  
  15. }  
打印結果:





8、靜態代碼塊

格式:static {靜態代碼塊執行語句;}
特點:隨着類的加載而執行,只執行一次,用於給類進行初始化的,優先於主函數
靜態代碼塊-->執行完->-構造代碼塊->--執行完->-構造函數 執行順序


9、對象的初始化過程 Person p = new Person(“zhangsan”,20),這句話都做了什麼

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

3.7 單例設計模式

設計模式:解決某一類問題最行之有效的方法,java有23中設計模式
單例設計模式:解決一個類在內存中只存在一個對象
想要保證對象唯一性:

1:先禁止其它程序建立該類對象,避免其它程序過多建立該類象(私有構造函數)
2:爲了讓其它程序可以訪問到該類對象,只好在本類中自定義對象
3:爲了方便其它程序對自定義對象的訪問,可以對外提供一些訪問方式

這三部怎麼用代碼體現呢?

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

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

[java] view plain copy
  1. <span style="font-size:14px;">class Single  
  2. {  
  3.     private int age;  
  4.   
  5.     private Single(){}//將構造函數封裝,禁止其它類創建Single類對象  
  6.     private static Single s=new Single();//創建本類對象  
  7.     public static Single getInstance()//對外提供訪問接口  
  8.     {  
  9.         return s;  
  10.     }  
  11.     public void setAge(int age)  
  12.     {  
  13.         this.age=age;  
  14.     }  
  15.     public int getAge()  
  16.     {  
  17.         return age;  
  18.     }  
  19.   
  20. }  
  21.   
  22. class SingleDemo  
  23. {  
  24.     public static void main(String[] args)  
  25.     {  
  26.         Single s1=Single.getInstance();  
  27.         Single s2=Single.getInstance();  
  28.         s1.setAge(20);  
  29.         System.out.println("age="+s2.getAge());//結果 20  
  30.   
  31.   
  32.     }  
  33. }  
  34. </span>  

單例內存分佈圖



單例設計的兩種模式:

[java] view plain copy
  1. <span style="font-size:14px;">/* 
  2. 這個是先初始化對象。 
  3. 稱爲:餓漢式。 
  4.  
  5. Single類一進內存,就已經創建好了對象。 
  6. class Single 
  7. { 
  8.     private static Single s = new Single(); 
  9.     private Single(){} 
  10.     public static Single getInstance() 
  11.     { 
  12.         return s; 
  13.     } 
  14. } 
  15. */  
  16.   
  17. //對象是方法被調用時,才初始化,也叫做對象的延時加載。稱爲:懶漢式。  
  18. //Single類進內存,對象還沒有存在,只有調用了getInstance方法時,才建立對象。  
  19. class Single  
  20. {  
  21.     private static Single s = null;  
  22.     private Single(){}  
  23.     public static Single getInstance()  
  24.     {  
  25.         if(s==null)  
  26.         {  
  27.             synchronized(Single.class)//加入同步鎖  
  28.             {                 
  29.                 if(s==null)  
  30.                     s = new Single();  
  31.             }  
  32.         }  
  33.         return s;  
  34.     }  
  35. }  
  36.   
  37. //記錄原則:定義單例,建議使用餓漢式。  
  38.   
  39. class  SingleDemo1  
  40. {  
  41.     public static void main(String[] args)   
  42.     {  
  43.         System.out.println("Hello World!");  
  44.     }  
  45. }</span> 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章