1. 程式人生 > 其它 >面向物件程式設計的三個基本特性

面向物件程式設計的三個基本特性

Java語言的三個基本特點

Java語言是面向物件的程式語言,故有三個基本特性,即:封裝性,繼承性,多型性。這三個特點主要體現在類上,下面對這三個特性逐一進行講解。

封裝性

    • 封裝即將資料密封起來,防止外界對資料進行更改。一般情況,類的屬性就是被封住了的。

    • 封裝性的幾個優點:提高程式碼的安全性以保護資料、統一介面、隱藏程式碼的實現細節、增加系統可維護性

    • 對資料進行封住主要是通過訪問許可權修飾符private來實現的,而將資料封裝後,就不能在類外呼叫、修改資料,因此需要用到類中的方法來實現。get()用來獲取私有屬性的值,set()用於修改私有屬性的值(簡而言之,就是通過類中的public方法來呼叫或修改類中的private屬性)。

      //例題
      class Student{
         private: //定義了四個學生類的私有屬性
         int age;
         int id;
         String name;
         String sex;
         public Student(){} //構造方法
         public void getAge(){ //獲取並返回age的值
             return age;
        }
         public void setAge(int a){ //設定age的值
             age=a;
        }
       
      }

      繼承性

      1. 繼承是存在於面向物件程式中兩個類之間的關係。被繼承的類稱為父類或超類,繼承的類稱為子類。子類可以呼叫父類的公用方法公用屬性。Object類是所有類的父類。

      2. 繼承的實現

        定義子類時,通過關鍵字extends來指明誰是父類。下面,以Person類,Teacher類,Student類來舉例:

        class Person{
           public String sex;
           public int age;
           public void live(){}
        }
        class Teacher extends Person{
           public String subject;
           public void teach(){}
        }
        class  Student extends Person{
           public score;
           public study(){}
        }
      3. 構造方法在類繼承中的作用

        要知道,構造方法是不能被繼承的,而子類又要對從父類中繼承的成員進行初始化,因此,在建立子類物件時,會先呼叫父類的構造方法然後再執行子類的構造方法。具體遵循以下原則:

        (1)子類可以通過在自己的構造方法的第一條可執行語句中通過關鍵字super來呼叫父類的構造方法。

        (2)若子類構造方法中沒有super關鍵字,在建立物件時,系統將自動呼叫父類的無參構造方法,然後再執行自己的構造方法。注意:當沒有關鍵字super,且父類中也沒有無參構造方法時,在編譯時會出錯。

        多型性

        一般的,面向物件的多型性體現在兩個方面:

        (1)方法的過載。

        (2)子類對父類方法的覆蓋。也就是子類對父類方法的重新定義。

        1. 方法的過載

          方法的過載就是同一個類中存在多個方法名相同但引數不同的方法,引數的差異包括引數型別,引數個數等。

          在呼叫方法時,方法匹配的原則是:先進行“精準匹配“,若找不到匹配的方法,在進行”自動型別轉換匹配“。

          所謂自動型別轉匹配,就是將實參型別轉換至與方法的形參表所匹配的型別。(自動型別轉換是按照值型別的等級由低轉到高,而強制型別轉換需要自己對值進行轉換。)

        2. 方法的覆蓋

          子類將從父類繼承的非私有方法在子類中重新定義,就是方法的覆蓋。這是,在通過子類的物件呼叫方法時,呼叫的就是子類自己重新定義的方法。

          在對父類的方法進行重寫時,應與父類具有完全相同的方法名,形參表,返回值型別一般也要相同。

          在對父類方法進行重寫時,需要注意:

          (1)方法的覆蓋不能改變方法的靜態或非靜態屬性。

          (2)不允許子類中方法的訪問修飾符比父類有更多限制。