1. 程式人生 > >面向對象的三大特征:繼承 封裝 多態

面向對象的三大特征:繼承 封裝 多態

ide args 使用 年齡 setsize return ring 關系 AR

面向對象: 面向對象專註於由誰來解決這個過程,而調用者無需關註對象實現的細節 編程特點: 出現了一個個的類,從類中拿到對象,通過對象直接解決問題

類:具有一系列相同屬性(特征)和方法(行為)的個體的集合 稱為類 類是一個抽象的概念,只能說類具有哪些屬性而不能直接對類進行賦值 例如 人類有身高這個屬性,但是不能說人類的身高是180 對象:從類中拿出具有具體屬性值的個體,稱為對象 對象是從類中拿出的一個具體的個體,需要對屬性進行具體的賦值 例如 人類有身高這個屬性,張三是人類的一個個體,就可以說張三身高是180 張三就是人類的一個對象

類和對象的關系
  1. 類是對象的抽象化,對象是類的具體化
  2. 類是對象的描述,對象是類的個體(實例化)
  3. 程序中由類產生對象.

屬性的封裝(一般使用private關鍵字實現) 1.將類的屬性進行私有化處理,不允許外部程序直接訪問,並對外提供統一的方法用於設置和讀取私有屬性 2.實現訪問控制,限制屬性訪問,但不是拒絕訪問 封裝的作用 只能通過規定的方法訪問數據,方便在方法中加入控制語句,防止不合法數據賦值 封裝:除了屬性的封裝外,將需要重復使用的代碼提取到方法中,這叫方法的封裝 將相同的屬性和方法抽象成一個類,這也是封裝的思想
private  int  age;
    
    public void setAge( int age) {
        
if (age>0&&age<100) { this.age=age; }else { System.out.println("輸入年齡不合法"); this.age=-1; } } public int getAge() { return this.age; }
set 方法用來賦值 get方法用來讀值

並且可以在set方法中設置判斷條件,例如上例就是判斷年齡是否符合常識

類的繼承 1. 子類繼承父類 使用 extends 關鍵字 子類繼承父類 不能繼承父類的私有屬性 2.子類中需要訪問父類成員,使用super關鍵字 super.屬性 訪問父類屬性 super.方法() 訪問父類方法 如果,子類中沒有同名的屬性和方法覆蓋父類,則依然可以直接使用this.屬性調用從父類中繼承的非私有屬性 如果,子類中有同名的屬性和方法,this.屬性訪問的是本類 super.屬性訪問的是父類的屬性 在子類的構造函數中,直接使用super() 表示調用父類構造 而且super()函數必須在子類構造的第一行 註意 即使使用super關鍵字 也不能使用父類的私有屬性和私有方法
3.子類可以訪問父類的哪些屬性 ①private   本類 ②默認()   本類   本包 ③protected 本類   本包   非同包子類 ④public   本類   本包   非同包子類 其他包 子類可以訪問父類的構造方法 4.繼承後的初始化順序
  1. 父類屬性
  2. 父類構造方法
  3. 子類屬性
  4. 子類構造方法
5.使用繼承可以: ①提高代碼的復用性,子類可以調用父類非私有的屬性和方法,不用再次編寫。

         ②提高代碼的維護性。

         ③將類與類聯系起來,是多態的前提。

繼承只能單繼承,不能多重繼承,但是可以多層繼承
          public class a;
          
            public class a2 extends   a;
          
            public class a3 extends   a2;

此時,a3就得到了a和a2兩個類的非私有屬性

多態 同一種事物,由於條件不同,產生不同的結果 程序中的多態 同一個引用類型,由於使用不同的對象實例而執行不同的操作
Chinese c=new chinese(); c.say();
english e=new english(); e.say();

英國人說英語,中國人說中文 這不叫多態

person p=new chinese();        p.say();
person p=new english();         p.say();

同樣是人 有人說英語,有人說中文 這叫多態

實現多態的條件 ①子類繼承父類 ②子類重寫父類方法 ③父類引用指向子類對象 保證了同一個父類引用類型,使用不同的子類對象實例,而執行不同的操作 abstract關鍵字 抽象類 使用abstract關鍵字修飾的類,稱為抽象類 抽象類.不能被實例化 抽象方法 使用abstract關鍵字修飾,而且沒有方法體的方法,稱為抽象方法 抽象方法.子類繼承抽象類,那麽,子類必須重寫父類的所有抽象方法,除非子類也是抽象類 抽象方法必須寫在抽象類中 抽象類中的方法不一定是抽象方法 例題: 請編碼實現如下需求:
樂器(Instrument)分為:鋼琴(Piano)、小提琴(Violin) 樂器(Instrument)包含品牌(brand)、重量(weight),
鋼琴(Piano)還包含尺寸(size),小提琴(Violin) )還包含長度(length) 各種樂器的彈奏( play )方法各不相同
在做類似題目時,最好按照以下步驟
  1. 發現類
  2. 發現類的屬性
  3. 發現類的方法

建一個父類(Instrument類 Instrument類有兩個屬性:品牌(brand)、重量(weight)以及一個抽象方法:彈奏( play )方法)

  public abstract class Instrument{


    private String brand;
    private String weight;
    public abstract void play();
    
    
    public Instrument() {
        super();
        }
    public Instrument(String brand, String weight) {
        super();
        this.brand = brand;
        this.weight = weight;    
        }


    public String getBrand() {
        return brand;
      }
    public void setBrand(String brand) {
        this.brand = brand;
      }
    public String getWeight() {
        return weight;
      }
    public void setWeight(String weight) {
        this.weight = weight;
      }

}

建兩個子類(鋼琴(Piano)、小提琴(Violin))

鋼琴(Piano)類中有私有屬性尺寸(size)

public class Piano extends Instrument{


    private String size;
public String getSize() { return size; } public void setSize(String size) { this.size = size; }

public Piano(String size) { super(); this.size = size; } public Piano() { super(); } @Override public void play() { // TODO Auto-generated method stub System.out.println("演奏家彈鋼琴");
} }

小提琴(Violin)類中有私有屬性長度(length)

public class Violin extends Instrument {

    
    private String length;
    

    public String getLength() {
        return length;
    }
    public void setLength(String length) {
        this.length = length;
    }
    
    public Violin(String length) {
        super();
        this.length = length;
    }
    public Violin() {
        super();
    }
    @Override
    public void play() {
        // TODO Auto-generated method stub
         System.out.println("演奏家拉小提琴");
} }

建一個多態類

演奏家 (演奏方法)

public class Performer {
    
    
    public void make(Instrument p) {
        p.play();
                
    }
}

最後建一個測試類

public static void main(String[] args) {
        
        Performer t=new Performer();
        t.make(new  Piano());
        t.make(new Violin());
        
        
        
        
        
    }

運行結果為:

技術分享圖片

面向對象的三大特征:繼承 封裝 多態