1. 程式人生 > >Java-面向物件(基礎篇)--面向物件基礎

Java-面向物件(基礎篇)--面向物件基礎

面向物件(基礎篇)
一. 面向物件的基本概念
面向物件是針對使用者的要求進行分析,將分析的結果設計成圖紙,然後將一切的準備工作全部處理完之後再分塊製作,最後將各個部分組裝在一起。
對於面向物件的程式設計用封裝性、繼承性、多型性3個主要特性。
1. 封裝性
封裝是面向物件的方法所應遵循的一個重要原則,有兩個含義。一是指把物件的靜態屬性和動態方法(行為)看成一個不可分的整體,將兩者“封裝”在一個不可分割的獨立單位(即物件)中;另一種含義是指“資訊隱蔽”,把不需要讓外界知道的資訊隱藏起來,有些物件的屬性及行為允許外界知道,但是不允許修改,有的屬性或行為,不允許外界知道,等。
封裝機制在程式設計中表現為,把描述物件屬性的變數及實現物件功能的方法合在一起,定義為一個程式單位,並保證外界不能任意更改其內部的屬性值,也不能任意調動其內部的功能方法。封閉機制的另一個特點是,為封裝在一個整體內的變數和方法規定不同級別的“可見性”或訪問許可權。
2. 繼承性


繼承是面向物件方法中的重要概念,並且是提高軟體開發效率的重要手段。
首先擁有反應事物一般特性的類,然後在其基礎上派生出反映特殊事物的類。在Java程式設計中,已有類可以是Java開發環境提供的最基本的類。使用者開發的程式類是繼承這些已有的類。被繼承的類成為父類或超類,而經繼承產生的類稱為子類或派生類。根據繼承機制,派生類繼承超類的所有成員,並相應的增加了自己的一些新成員。Java中只允許單繼承,即一個子類只能繼承一個父類。而Java語言通過interface(介面)的方式來彌補Java不支援多繼承而帶來的子類不能享用多個子類父類成員的缺點。
3. 多型性
多型性是面向物件的另一重要特性。多型是允許程式中出現重名現象。Java語言中含有方法測過載與物件多型兩種形式的多型。
方法的過載:在一個類中,允許多個方法使用同一個名字,但方法的引數不同,完成的功能也不同。
物件多型:子類物件可以與父類物件進行轉換,而且根據其使用的子類不同,完成的功能也不同。
二. 類與物件
1. 類與物件的關係
在面向物件中,類和物件是最基本、最重要的組成單元。類實際上表示一個客觀世界某群體的一些基本特徵抽象。物件就是一個個具體的東西。例如:
*
人類(類):定義出了一個基本的模板,代表著一個共性
張三、王二、、、(物件):沒一個具體的人,根據不同給予不同的姓名等,代表一個特性。*
2. 類的定義
從類的概念中可以瞭解,類是由屬性和方法組成。屬性中定義的是類需要的一個個具體資訊,實際上一個屬性就是一個變數,而方法是一些操作的行為,但是在程式設計中,定義類也是要按照具體的語句要求完成的。類的定義如下:
【類的定義】

class 類名稱{
        資料型別 屬性;
        ...//宣告成員變數
        }
public 返回值型別 方法名稱(引數1,引數2,。。。。){
            程式語句;
            [return
表示式;]//定義方法的內容 }

【Person類】

class Person{
    // 人中有姓名和年齡兩個屬性
    String name ;       // 表示姓名
    int age ;           // 表示年齡
    public void tell(){
        System.out.println("姓名:" + name + ";年齡:" + age) ;
    }
};

Person類定義了name和age兩個屬性,然後定義了一個方法tell,此方法列印兩個屬性的內容。
類中定義方法的補充說明:此處的方法與之前的方法定義有區別,並沒有加上static關鍵字,這是因為此時定義的方法將要由物件呼叫,而不像之前那樣與主方法定義在一個類中且由主方法直接呼叫。
3. 物件建立及使用
在上面建立了一個類,要想使用必須有物件。
【物件的建立】

類名 物件名稱=null;
物件名稱=new 類名();

或者

類名 物件名稱=new 類名();
class Person{
    // 人中有姓名和年齡兩個屬性
    String name ;       // 表示姓名
    int age ;           // 表示年齡
    public void tell(){
        System.out.println("姓名:" + name + ";年齡:" + age) ;
    }
};
public class ClassDemo02{
    public static void main(String args[]){
        Person per = new Person() ;
    }
};

以上程式在主方法中例項化了一個person物件,物件名稱為per。與之前陣列的建立過程相似,物件的例項化也是要劃分堆、棧記憶體的,具體過程如下:
這裡寫圖片描述

從圖中可以看出所有的物件名稱都在棧記憶體中儲存,而物件的具體內容儲存在對應的堆記憶體中,必須使用關鍵字new才能開闢堆記憶體空間,在堆記憶體空間中儲存著物件的屬性資訊,此時,因為per物件剛剛被例項化玩,所以物件中的屬性內容都是預設值,字元出的預設值為null,整數的預設值是0.
    棧中存放的是堆空間的地址。

    如果要使用物件訪問類中的某個屬性或方法可以使用如下語句:
    訪問屬性:物件名.屬性名
    訪問方法:物件名.方法名()
    【tell方法輸出】
class Person{
    String name ;       // 宣告姓名屬性
    int age ;           // 宣告年齡屬性
    public void tell(){ // 取得資訊
        System.out.println("姓名:" + name + ",年齡:" + age) ;
    }
};
public class ClassDemo03{
    public static void main(String args[]){
        Person per = null ;     // 宣告物件
        //per = new Person() ;  // 例項化物件
        per.name = "張三" ;       // 為姓名賦值
        per.age = 30 ;          // 為年齡賦值
        per.tell() ;            // 呼叫方法,列印資訊
    }
};

程式執行結果:

姓名:張三,年齡:30

物件使用前必須例項化。
4. 建立多個物件
前面已經介紹了一個物件的建立過程,那麼按照此格式可以同時建立多個物件,每個物件都用自己的棧、堆空間。
【建立兩個物件】

class Person{
    String name ;       // 宣告姓名屬性
    int age ;           // 宣告年齡屬性
    public void tell(){ // 取得資訊
        System.out.println("姓名:" + name + ",年齡:" + age) ;
    }
};
public class ClassDemo05{
    public static void main(String args[]){
        Person per1 = null ;        // 宣告per1物件
        Person per2 = null ;        // 宣告per2物件
        per1 = new Person() ;       // 只例項化per1一個物件
        per2 = per1 ;               // 把per1的堆記憶體空間使用權給per2
        per1.name = "張三" ;      // 設定per1中的name屬性內容
        per1.age = 30 ;             // 設定per1中的age屬性內容
        // 設定per2物件的內容,實際上就是設定per1物件的內容
        per2.age = 33 ;             // 設定per2中的age屬性內容
        System.out.print("per1物件中的內容 --> ") ;
        per1.tell() ;               // 呼叫類中的方法
        System.out.print("per2物件中的內容 --> ") ;
        per2.tell() ;               // 呼叫類中的方法
    }
};

程式執行的結果為:

per1物件中的內容 --> 姓名:張三,年齡:33
per2物件中的內容 --> 姓名:張三,年齡:33

由程式執行結果可以發現,程式分別例項化了兩個Person物件,每當關鍵字new出現的時候必定開闢了新的堆記憶體空間,那麼per1和per2分別指向不同的各自的堆記憶體空間。需要注意的是,一個棧記憶體空間只能指向一個堆記憶體空間,如果要想再指向其他的堆記憶體空間,則必須先斷開已有的指向才能分配新的指向。