1. 程式人生 > >java面對物件(二)--類與物件

java面對物件(二)--類與物件

        Java語言把一組物件中相同屬性和方法抽象到一個Java原始檔就形成了類。

        類是建立物件的模板,確定物件將會擁有的屬性和方法。

        類是一種資料型別,是物件的型別(不同於int等基本型別:類具有方法)

        類是物件的抽象化;物件是類的具體化。

        物件同時具有屬性和方法兩項特性。

        在面向物件程式設計中,類是一個獨立的單位,它有一個類名,其內部包括成員變數,用於描述物件的屬性;還包括類的成員方法,用於描述物件的行為。在Java程式設計中,類被認為是一種抽象資料型別,這種資料型別,不但包括資料,還包括方法。這大大地擴充了資料型別的概念。

        類是一個抽象的概念,要利用類的方式來解決問題,必須用類建立一個例項化的類物件,然後通過類物件去訪問類的成員變數,去呼叫類的成員方法來實現程式的功能。這如同“汽車”本身是一個抽象的概念,只有使用了一輛具體的汽車,才能感受到汽車的功能。

        一個類可建立多個類物件,它們具有相同的屬性模式,但可以具有不同的屬性值。Java程式為每一個類物件都開闢了記憶體空間,以便儲存各自的屬性值。物件與物件之間也可以相互聯絡和相互作用,我們把這種方式稱為“訊息”。 一個訊息主要由5部分組成:傳送訊息的物件、接收訊息的物件、訊息傳遞辦法、訊息內容(引數)、反饋。

        定義一個類的步驟:1、定義類名;2、定義類的屬性;3、定義類的方法

        public class  類名 {  }

        關鍵字class引入類的定義。

        類名要符合識別符號命名規範。

匿名物件使用場景:

        1當對方法只進行一次呼叫的時候,可以使用匿名物件。

        2當物件對成員進行多次呼叫時,不能使用匿名物件。必須給物件起名字。

 在類中定義其實都稱之為成員。成員有兩種:

        1:成員變數:其實對應的就是事物的屬性。

        2:成員函式:其實對應的就是事物的行為。

       所以,其實定義類,就是在定義成員變數和成員函式。但是在定義前,必須先要對事物進行屬性和行為的分析,才可以用程式碼來體現。

通過new關鍵字建立物件。建立物件又稱例項化物件。

        this在例項方法中通常被省略,除非例項方法中包含與成員變數同名的區域性變數時,訪問成員變數需要使用this。

        Student  lisi = new Student();

        使用”.”運算子訪問物件的屬性和方法。

            lisi.屬性 = 值;

            lisi.方法名();

        private int age;//私有的訪問許可權最低,只有在本類中的訪問有效。

注意:私有僅僅是封裝的一種體現形式而已。

私有的成員:其他類不能直接建立物件訪問,所以只有通過本類對外提供具體的訪問方式來完成對私有的訪問,可以通過對外提供函式的形式對其進行訪問。

好處:可以在函式中加入邏輯判斷等操作,對資料進行判斷等操作。

總結:開發時,記住,屬性是用於儲存資料的,直接被訪問,容易出現安全隱患,所以,類中的屬性通常被私有化,並對外提供公共的訪問方法。

這個方法一般有兩個,規範寫法:對於屬性 xxx,可以使用setXXX(),getXXX()對其進行操作。

注意:主函式的存在,僅為該類是否需要獨立執行,如果不需要,主函式是不用定義的。

主函式的解釋:保證所在類的獨立執行,是程式的入口,被jvm呼叫。

        1:成員變數直接定義在類中。

           區域性變數定義在方法中,引數上,語句中。

        2:成員變數在這個類中有效。

            區域性變數只在自己所屬的大括號內有效,大括號結束,區域性變數失去作用域。

        3:成員變數存在於堆記憶體中,隨著物件的產生而存在,消失而消失。

            區域性變數存在於棧記憶體中,隨著所屬區域的執行而存在,結束而釋放。

建構函式:

        用於給物件進行初始化,是給與之對應的物件進行初始化,它具有針對性,函式中的一種。

特點:

        1該函式的名稱和所在類的名稱相同。

        2不需要定義返回值型別。

        3該函式沒有具體的返回值。

        構造方法負責初始化類中的例項變數。非“類變數”

        構造方法是一種特殊的方法,這種方法必須滿足以下語法規則:

        構造方法必須與類名相同;

        不包含返回值型別描述部分

記住:

        所有物件建立時,都需要初始化才可以使用。

        構造方法是一個類物件例項化的起點,例項化的目的是為了給類成員初始化,所以引用的成員應該是常量而不是變數,不能將成員作為引數引用。

注意事項:

        一個類在定義時,如果沒有定義過建構函式,那麼該類中會自動生成一個空引數的建構函式,為了方便該類建立物件,完成初始化。如果在類中自定義了建構函式,那麼預設的建構函式就沒有了。

        建立類時,如果沒有顯式定義構造方法,則該類會存在一個預設的無參構造方法;

        可以在類中宣告一個或多個有參構造方法,但每個構造方法在引數個數或引數資料型別上要有所差別:

        一個類中,可以有多個建構函式,因為它們的函式名稱都相同,所以只能通過引數列表來區分。所以,一個類中如果出現多個建構函式。它們的存在是以過載體現的。

        如果類中存在顯式構造方法,則預設的無參構造方法將不復存在,除非顯式定義無參構造方法:

        1兩個函式定義格式不同。

        2建構函式是在物件建立時,就被呼叫,用於初始化,而且初始化動作只執行一次。

   一般函式,是物件建立後,需要呼叫才執行,可以被呼叫多次。

        分析事物時,發現具體事物一出現,就具備了一些特徵,那就將這些特徵定義到建構函式內。

        構造程式碼塊:是給所有的物件進行初始化,也就是說,所有的物件都會呼叫一個程式碼塊。只要物件一建立。就會呼叫這個程式碼塊。

        建構函式:是給與之對應的物件進行初始化。它具有針對性。

        1、如果父類擁有無參構造方法(無論隱式的還是顯式的)且子類中的構造方法又沒有明確指定呼叫父類的哪個構造方法,則子類的構造方法使用super()隱式呼叫父類的無參構造方法。

        當例項化子類時,先例項化父類

        如果子類構造方法使用隱式方式呼叫父類的無參構造方法,則子類中構造方法之間可以使用this進行呼叫

        2、如果父類沒有無參構造方法(無論隱式的還是顯式的),則要求子類構造方法必須直接或間接指定呼叫父類哪個構造方法並且放在有效程式碼第一行

This:

        代表物件。就是所在函式所屬物件的引用。

this到底代表什麼呢?

        哪個物件呼叫了this所在的函式,this就代表哪個物件,就是哪個物件的引用。this代表對當前物件的一個引用

開發時什麼時候使用this呢?

        在定義功能時,如果該功能內部使用到了呼叫該功能的物件,這時就用this來表示這個物件。

this 還可以用於建構函式間的呼叫。

呼叫格式:this(實際引數);

        this物件後面跟上 .  呼叫的是成員屬性和成員方法(一般方法);

        this物件後面跟上 () 呼叫的是本類中的對應引數的建構函式。

注意:

        用this呼叫建構函式,必須定義在建構函式的第一行。因為建構函式是用於初始化的,所以初始化動作一定要執行。否則編譯失敗。

this實現一個類中構造方法之間的呼叫

        類中可以有多個構造方法,構造方法之間可以通過this實現呼叫,但必須將呼叫建構函式程式碼寫在有效程式碼的第一行:

        普通方法不能使用this呼叫類中構造方法

物件初始化過程

用new建立並初始化物件步驟:

        給物件的例項變數分配記憶體空間,預設初始化成員變數;

        成員變數宣告時的初始化;

        初始化塊初始化;

        構造方法初始化

初始化塊:就是在類中用一對大括號括起來的程式碼塊,語法形式如下:

  {

          //程式碼塊

 }



Person p =new Person();

        1先將硬碟上指定位置的Person.class檔案載入進記憶體。

        2執行main方法時,在棧記憶體中開闢了main方法的空間(壓棧-進棧),然後在main方法的棧區分配了一個變數p。

        3在堆記憶體中開闢一個實體空間,分配了一個記憶體首地址值。new

        4在該實體空間中進行屬性的空間分配,並進行了預設初始化。

        5對空間中的屬性進行顯示初始化。

        6進行實體的構造程式碼塊初始化。

        7呼叫該實體對應的建構函式,進行建構函式初始化。()

        8將首地址賦值給p ,p變數就引用了該實體。(指向了該物件)