1. 程式人生 > >類 與 物件

類 與 物件

面向物件概述

  • 面向物件的程式設計(OOP)是建立在把物件作為基本實體看待的面向物件(object oriented)的模型上的,這種模型可以使物件之間互動操作。
  • 面向物件的程式設計具有3個基本特徵:封裝、繼承、多型,可以大大增強程式的可靠性、程式碼的重用性和程式的可維護性,從而提高程式的開發效率。
  • (1)封裝(encapsulation):就是把客觀事物抽象並封裝成物件,即將資料成員、屬性、方法和事件集合在一個整體內。通過訪問控制,還可以將隱藏內部成員,只允許可信的物件訪問或操作自己的資料或方法。 封裝保證了物件的獨立性,可以防止外部程式破壞物件的內部資料,同時便於程式的維護和修改。
  • (2)繼承(inheritance):是面向物件的程式設計中程式碼重用的主要方法。繼承允許使用現有類的功能,並在無須重新修改原來類的情況下,對這些功能進行擴充套件。繼承可以避免程式碼複製和相關的程式碼維護等問題。 繼承的過程,就是從一般到特殊的過程。被繼承的類稱為“基類(base class)”、“父類”或“超類(super class)”,通過繼承建立的新類稱為“子類(subclass)”或“派生類(derived class)”。
    一個子類只能有一個基類(單一繼承),但允許多個介面。
  • (3)多型(polymorphism):是指同樣的訊息被不同型別的物件接收導致完全不同的行為。多型性允許每個物件以自己的方式去響應共同的訊息,從而允許使用者以更明確的方式建立通用軟體,提高軟體開發的可維護性。

類與物件概述

 類(class)是java語言的核心,java的一切型別都是類,所有的語句都必須位於類內。java類庫中包含大量解決問題通用的類,一般可以通過建立自定義類和使用Java類庫來解決實際問題。
  類是一個數據結構,類定義資料型別的資料(欄位)和行為(方法)。物件(object)是基於類的基本例項(instance)。
 物件是系統中用來描述客觀事物的一個實體,它是構成系統的一個基本單位。一個物件由一組屬性和對這組屬性進行操作的一組服務組成。
  類的例項化可生成物件,一個物件的生命週期包括三個階段:生成、使用、消除。
  當不存在對一個物件的引用時,該物件成為一個無用物件。Java的垃圾收集器自動掃描物件的動態記憶體區,把沒有引用的物件作為垃圾收集起來並釋放。當系統記憶體用盡或呼叫System.gc( )要求垃圾回收時,垃圾回收執行緒與系統同步執行。

  • 類的宣告:
  1. 使用類宣告可以建立新的類。宣告一個類就是建立一個新的資料型別,而類在java中屬於引用資料型別。java使用關鍵字class來宣告類。類的屬性稱為資料成員,對資料成員進行的操作稱為成員方法。類的組成成分是資料成員和成員方法。資料成員用來描述物件的屬性,它可以是任何變數型別,包括物件型別;成員方法用來刻畫物件的行為或動作,每一個成員方法確定一個功能或操作。類的宣告的簡明形式如下:
[類修飾符]   class  類名[extends 基類][implements 介面列表]{
類體}
  1. 各部分意義:
     (1)類修飾符(可選):用於定義類的可訪問性等資訊(public、abstract、final、private、protected)。
     (2)class:關鍵字,注意首字母小寫。
     (3)類名:所要定義的類的識別符號,必須符合識別符號的命名規則,一般採用PascalCase命名規範,例如MyClass。
     (4)extends 基類(可選):用於宣告要繼承的類。
     (5)implements 介面列表(可選):用於宣告要實現的一個或多個介面。
     (6)類體:用於定義該類的成員包括在一對花括號之間,類體可以為空。

類的構造方法:

 將成員變數初始化封裝起來的方法稱為構造方法(constructor)。
(1)構造方法名必須與類名相同。
 (2)構造方法總是和new運算子一起被呼叫。
(3)構造方法不返回任何值,也沒有返回型別(包括void型別)。
(4)每一個類可以有零個或多個構造方法,即構造方法可以過載。
 (5)構造方法在建立物件時自動執行,一般不能顯式地直接呼叫。
 (6)如果使用者在一個自定義類中未定義該類的構造方法,系統將自動為這個類定義一個預設的空構造方法。

class Person{
    public int age;//資料成員 或稱 成員屬性
    public String name;
    public String sex;
    public Person(){ //不帶引數的構造方法

    } 
    public Person(int age1,String name1,String sex1){//帶三個引數的構造方法
        age = age1;
        name = name1;
        sex = sex1;
    }
    public int getAge() {  //成員方法 get set  
        return age;
    }

    public void setAge(int age) {
        this.age = age;  //this 指明賦值號左邊為引用當前物件的成員變數
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }
     public void sleep(){//行為   成員方法   函式
        System.out.println("Person.sleep()");
    }
    public void eat(){
        System.out.println("Person.eat()");
    }
   
  }
public class ClassObject {
    public static void main(String[] args) {
        //建立Person 類的兩個物件person1,person2
        Person person1 = new Person(20, "lili", "woman");
        Person person2 = new Person(21, "Tom", "man");
        //物件的資料成員的使用
        person1.age = 20;
        person1.name="lili";
        person1.sex="woman";
        person2.age = 21;
        person2.name="Tom";
        person2.sex="man";
        //物件的成員方法的呼叫
        System.out.println("Age  of person1:"+person1.getAge());
        System.out.println("Name  of person1:"+person1.getName());
        System.out.println("Sex  of person1:"+person1.getSex());
        System.out.println("Age  of person2:"+person2.getAge());
        System.out.println("Name  of person2:"+person2.getName());
        System.out.println("Sex  of person2:"+person2.getSex());
    }
}
  • 物件的初始化有兩種方式:
    (1)get set方法的呼叫;
    (2)通過合適的建構函式進行初始化:
  • 物件的建立分為兩步:
    (1)首先為物件分配記憶體;
    (2)呼叫合適的建構函式;

this的引用:

 在java中,系統預設每個類都預設地具有null、this和super三個物件引用變數,所以在任意類中不加說明直接使用這三個物件。其中,null代表空物件,一般用null來代表未建立的物件;this是指當前物件的引用,指的是當前物件的記憶體;super是指對父類物件的引用。
 當需要引用當前物件的資料成員或成員方法時,便可以利用this來實現這個目的,this表示的就是當前物件本身,即當前物件的一個引用。可以通過“this.類中的方法名(成員名)” 來實現對類的方法或成員的訪問。

class Person{
    private int age;//private 只能被這個類本身訪問,構造方法為private則其它類不能聲稱該類的一個例項
    public String name;//public  可以被所有類訪問
    public String sex;
     protected  void setAge(int age){ //protected 可以被這個類本身、它的子類和同一個包中的所有其他的類訪問
         this.age = age;
     }
    public void setName(String name) {
        this.name = name;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }

    Person(int age,String name,String sex){
         this.setAge(age);
         this.setSex(sex);
         this.setName(name);
    }
    public void print(){
         System.out.println("name="+name+"age="+age+"sex="+sex);
    }

靜態塊初始化 例項塊初始化

  • static 修飾的的變數屬於類,不屬於物件 ,存放在 方法區,
    static 所修飾的方法或者資料成員不依賴於物件。
  • 靜態塊初始化:
    static{
    }
    靜態方法 靜態成員 不屬於物件,不能使用物件名呼叫,靜態資料:靜態塊 同等級, 初始化順序與順序相關。
  • 靜態程式碼塊只初始化一次
  • 例項塊初始化
    {
    this.name=“lili”;
    this.sex=“woman”;
    this.age=20;
    }
class Person1 {
        private int age;//資料
        private String name;
        private String sex;
        private  static  int count;

        {
            this.name = "lili";
            this.sex = "woman";
            this.age = 20;
            System.out.println("instance {} init");//例項塊初始化
        }

        public Person1() {
            System.out.println("Person().constrcutor");//建構函式初始化
        }

        static {             //static所修飾的方法或者資料成員不依賴於物件
            count = 1;
            System.out.println("static {} init");//靜態塊初始化
        }
        @Override//覆蓋(重寫)
        public String toString() {
            return "Person{" +
                    "age=" + age +
                    ", name='" + name + '\'' +
                    ", sex='" + sex + '\'' +
                    '}';
        }
    }
    public class ClassObject {
    public static void main(String[] args) {
            Person1 person1 = new Person1();
            System.out.println(person1);
        }
     }    

輸出:

static {} init
instance {} init
Person().constrcutor
Person{age=20, name='lili', sex='woman'}
  • 物件的初始化順序:
    靜態塊初始化====》》例項程式碼塊初始化======》》建構函式初始化

    Over…注意物件初始化時get()、set()方法的使用,this.方法,是指當前物件的引用,指的是當前物件的記憶體。