黑馬程序員——Java基礎知識——面向對象(一)

                ------Java培訓、Android培訓、iOS培訓、.Net培訓、期待與您交流!

 一、什麼是面向對象

         當你想要用一件東西完成一個動作或做一件事情時,這個動作或這件事情是這件東西可以完成的動作,我們要做的就是指揮這件東西,告訴它去做。比如開門,   我們只是轉一下把手,給門一個要打開的信號,然後門通過自己具備的功能,轉動門軸、合頁等,實現門的打開。這就是Java中的面向對象的思想。C語言中是面向   過程思想,強調功能行爲,例如:打開門——關閉門。而Java中的面向對象的思想是基於面向過程的思想而來的,強調具有功能的對象,例如:門打開——門關閉。   在面向對象的思想中,操作者變成了調用者,通過調用對象,來實現相關需求。

  面向對象的特點 :

        面向對象是一種符合人們思考習慣的思想,可以將複雜的事情簡單化,將程序的執行者轉化爲調用者。 在操作中,應先去尋找封裝了所需功能的對象來調用。沒   有的話就創建一個封裝所需功能的對象。 這樣做可以簡化開發也可以提高複用性。Java的開發過程就是不斷的創建對象,使用對象,指揮對象做事情的。而設計的     過程就是在管理和維護對象之間的關係。

  面向對象的特徵:封裝(encapsulation),繼承(inheritance),多態(polymorphism).

 

 二、怎麼用面向對象      

     1.類和對象

          使用計算機語言就是不斷的描述現實生活中的事物,而Java中描述事物通過類的形式體現,類是具體事物的抽象。生活中描述事物就是描述事物的屬性和行  爲,如人的年齡、人的身高等屬性以及說話吃飯等行爲。Java中就是用類class來描述對象的屬性和行爲。定義一個類就是定義在類中的成員(成員變量(對應屬性)和成  員函數(對應行爲))。而對象是該類事物實實在在存在的個體。類和對象的關係就如同設計汽車的圖紙與汽車的關係,圖紙就是類,汽車就是具體的對象。

           定義一個簡單的類,並創建它的對象。如:

class Demo
{
	public static void main(String[] args) 
	{    
		//創建student的一個對象。
		Student s=new Studnet();
		//給對象的屬性賦值。
		s.name="小明";
		//調用對象的動作
		s.speak();
	}
}
//定義一個表示學生的類,類中定義學生的姓名、年齡屬性,以及學習的行爲。
class Student
{
  String name;
  int age;
  public void study(){
	  System.out.println("在學習");
  }
}
  2.成員變量和局部變量

          兩者在作用範圍和內存中分配不同。成員變量定義在類中,在整個類中都可以被訪問;成員變量隨着對象的建立而建立,存在於對象所在的堆內存中。並且有    默認的初始化值。

          局部變量只定義在局部範圍內,如:函數、語句內等,局部變量存在與棧內存中。作用的範圍結束,變量空間會自動釋放,並沒有默認的初始化值。

   3.匿名對象

          對象的簡化。在兩種情況下可以使用匿名對象:當對對象僅調用一次時或者將匿名對象作爲實際參數進行傳遞。如果對一個對象的成員進行多次調用時,就不     能用匿名對象了。

 

   4.封裝

           封裝是面向對象的三大特徵之一,是指隱藏對象的屬性和實現細節,僅對外提供公共訪問方式。就是定義類時把不需要對外提供的屬性或方法都隱藏   起來了,對於隱藏起來的屬性,類中定義了公共方法對其訪問。封裝能夠將變化隔離,便於使用,提高代碼的重用性與安全性。

           而私有(private)是封裝最常見的表現形式。private:權限修飾符,用於修飾類中的成員(成員變量、成員函數),私有的成員只在本類中有效。在以後的   操作中,定義一個類通常將成員變量私有化,對外提供對應的set,get方法對其進行訪問。這樣做提高了數據的安全性。

    如下圖:

    

class Demo
{
	public static void main(String[] args) 
	{    
		//創建student的一個對象。
		Student s=new Student();
		//調用訪問方法,給對象年齡賦值。
		s.setName("小明");
		//調用獲取方法,獲取對象年齡。
		s.getName();
	}
}
//定義一個表示學生的類,類中定義學生的姓名屬性,以及學習的行爲。
class Student
{
  //將成員屬性name私有
  private String name;
  //提供訪問方法
  public void setName(String studentName){
	    name=studentName;
  }
  //提供獲取方法
  public String getName(){
	  return name;
  }
  public void study(){
	  System.out.println("在學習");
  }
}

  5.構造函數

         構造函數的函數名與類名同名,不用定義返回值類型,不可以寫return語句。構造函數是用來給對象進行初始化的。當一個類中沒有定義構造函數時,

  系統會默認給該類加入一個空參數的構造函數。當類中自定義了構造函數之後,默認的構造函數就沒有了。 構造函數與一般函數除了在寫法上有很大不       同,在運行時也有很大不同,構造函數在對象一建立就運行,給對象初始化,而一般方法是對象調用才執行;一個對象建立,構造函數只運行一次,而一   般方法可以被對象調用多次。當分析事物時,如果該事物存在具備一些特性或者行爲,那麼可以將這些內容定義在構造函數中。          

        構造代碼是給對應的對象進行初始化,而構造代碼塊是給所有對象初始化。當對象一建立,構造代碼塊就運行,而且優先於構造函數。構造代碼塊中  定義的是不同對象共性的初始內容。

       例如:

class Demo
{
	public static void main(String[] args) 
	{    
		//創建student的一個對象。
		Student s=new Student("小明");
		//調用方法
		s.study();
	}
}
//定義一個表示學生的類,類中定義學生的姓名屬性,以及學習的行爲。
class Student
{
  //將成員屬性name私有
  private String name;
  //定義構造函數
  Student(String name)
  {
	  this.name=name;//this表示初始化的對象,因爲成員變量名和局部變量名一樣,所以用this加以區分。
     System.out.println("我的名字是"+name);
  }
  //定義構造代碼塊
  {
     System.out.println("我是一名學生");
  }
  //提供訪問方法
  public void setName(String name){
	    this.name=name;
  }
  //提供獲取方法
  public String getName(){
	  return name;
  }
  public void study(){
	  System.out.println("在學習");
  }
}
執行結果



   6.this關鍵字  

         從上面的程序可以瞭解this關鍵字的用法,this代表它所在函數所屬對象的引用,就是哪個對象在調用this所在的函數,this就代表哪個對象。當定義類  中功能時,該函數內部要用到調用該函數的對象時,就用this來表示這個對象。

          this語句:是用於構造函數之間進行相互調用的。this語句只能定義在構造函數的第一行,因爲初始化要先執行。一般函數不能直接調用構造函數,因  爲this語句不能用在一般函數中,只能用在構造函數間。

         例如:     

 Student(String name)
  {
	  this.name=name;
    
  }
  Student(String name,int age)
  {
        this(name);
        this.age=age;
  }
   this關鍵字有時可以不寫,系統會默認爲引用所在函數的對象,但當出現成員變量和局部變量同名時,就必須寫上this,加以區分。構造函數間調用時要用上this語句。

 7.static關鍵字

         static:靜態修飾符,用於修飾類中的成員(成員變量和成員函數)。當成員被靜態修飾後,除了可以被對象調用外,還可以直接被類名調用(類名.靜態  成員)。靜態成員隨着類的加載而加載,也隨着類的消失而消失,生命週期長。靜態成員先於對象存在。靜態成員可以被所有對象共享。由於靜態成員可以直接被類名調用,所以靜態成員變量又稱爲類變量。而非靜態成員變量成爲實例變量。

        實例變量和類變量的區別:類變量隨着類的加載而存在於方法區中,實例變量隨着對象的建立而存在於堆內存中;類變量生命週期最長,隨着類的消  失而消失。實例變量生命週期短,隨着對象的消失而消失。

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

         定義靜態變量,可以對共享數據進行單獨空間的存儲,節省內存空間,但生命週期過長;定義靜態方法,只可以訪問靜態成員(非靜態方法既可以訪問  靜態也可以訪問非靜態),具有侷限性。靜態方法中不可以定義this、super關鍵字,因爲靜態優先於對象存在,所以靜態方法中不可以出現this。

         主函數是靜態的。

         靜態代碼塊:隨着類的加載而執行,執行一次。並優先於主函數。用於給類進行初始化。

         格式:static{執行語句}

 8.主函數

       一個特殊的函數。作爲程序的入口,可以被JVM調用。

    主函數的定義:

        public:代表着該函數訪問權限是最大的。

        static:代表主函數隨着類的加載就已經存在了。

        void:主函數沒有具體的返回值。

        main:不是關鍵字,但是是一個特殊的單詞,可以被JVM識別。

     String[] arr):函數的參數,參數類型是一個數組,該數組中的元素是字符串。字符串類型的數組。

        argsarguments  參數  。唯一可以更改的地方。

 9.對象的初始化過程:

          1.把類名.class文件加載到內存中。

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

         3.在堆內存中開闢空間,給對象分配內存地址。  

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

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

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

          7.對對象進行構造函數初始化。

          8.將內存地址賦給棧內存中的對象變量。

 10.單例設計模式

         設計模式是指解決某一問題最行之有效的方法。Java中有23種設計模式。單例設計模式是經常會用到的一種模式。單例設計模式中一個類在內存中只     存在一個對象,保證了內存中的對象唯一性。單例設計模式有兩種格式:懶漢式和餓漢式。

          (1)餓漢式:餓漢式中先建立對象,class類一加載進內存,就創建該類對象。在實際開發中,經常使用餓漢式,保證程序的安全性。

class Single
{
	//將構造函數私有化
	private Single(){}
       //在類中創建本類對象
	public static Single s=new Single();
	//提供獲得該類對象的訪問方式
	public static Single getInstance(){
		return s;
	}
}
        (2)懶漢式:方法被調用時,纔在內存中創建對象。即對象的延時加載。

class Single
{
	//將構造函數私有
	private Single(){}
    //定義引用變量 
	public static Single s=null;
	//提供獲得該類對象的訪問方式
	public static Single getInstance(){
		//創建本類對象
		if(s==null)
		     s=new Single();    
		return s;
	}
}


                      -------------Java培訓、Android培訓、iOS培訓、.Net培訓、期待與您交流! -------

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