面向對象的三大特徵:封裝、繼承、多態
1封裝:屬性私有化,對外提供統一訪問的get/set接口。完全封裝
封裝指的是將對象的狀態信息(屬性)和行爲(方法)捆綁爲一個邏輯單元的機制。將類的某些信息隱藏在類的內部,不允許外部程序直接訪問,而是通過該類提供的方法實現對隱藏
信息的操作與訪問。
java中通過將數據封裝聲明爲私有的(private),再提供一個或多個公開的(public)方法實現對該屬性的操作,以實現下述目的:
(1).隱藏一個類的實現細節
(2).防止對封裝數據未經授權的訪問。使用者只能通過事先制定好的方法來訪問數據,可以方便的加入控制邏輯,限制對屬性的不合理操作。
(3)有利於保證數據的完整性
(4)便於修改,增強代碼的可維護性。
爲了實現良好的封裝,需要從兩方面考慮:
(1)將對象的屬性和實現細節隱藏起來,不允許外部直接訪問
(2)把方法暴露出來,讓方法來操作或訪問這些屬性
實現封裝的關鍵是不要讓方法直接訪問其他類的屬性,程序應該只能通過指定的方法與對象的數據交互。封裝賦予對象”黑盒”特性,這是實現重用性和可靠性的關鍵。
使用訪問控制符:(private、默認、protected、public)
(1)private:訪問控制級別:如果類裏的一個成員(包括屬性或方法)使用private訪問控制符來修飾,則這個成員只能在該類的內部被訪問。顯然,這個訪問控制符修飾屬性最合適,使用它來修飾屬性就可把屬性隱藏在類的內部。
(2)default訪問控制權限(包訪問權限):如果類裏的一個成員(包括屬性和方法)或則一個頂級類不使用任何訪問控制符,我們就成他爲默認的訪問控制,defaule訪問控制的成員或頂級類可以被相同包下的其他類訪問。
(3)protected訪問控制權限(子類訪問權限):如果一個成員(包括屬性和方法)使用protected訪問控制修飾符,那麼這個成員既可以被同一包中的其他類訪問,也可以被不同包中的子類訪問。通常情況下,如果protected來修飾一個方法,通常是希望其子類重用這個方法。
(4)public訪問控制權限(公共訪問權限):這是一個最寬鬆的訪問控制級別,如果一個成員(包括屬性和方法)或者一個頂級類使用public修飾,這個成員或頂級類就可以被所有的類訪問。不管訪問類和被訪問類是否處於同一個包中,是否具有父子類繼承關係。
定義一個Animals類
public class Animals { //定義屬性 private String name; private int age; public void Info(){ System.out.println("我是一隻動物"); } //定義輸出名字name和年齡age的方法 public void ToString(String name,int age){ System.out.println("name:"+this.getName()+",age:"+this.getAge()); } //定義屬性存值取值的get()/set()方法 public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
2.繼承:
繼承的特點:
(1)java通過extends關鍵字來實現,實現繼承的類被稱爲子類,被繼承的類被稱爲父類,有時候也稱爲基類、超類。
(2)在繼承關係中,父類更通用,子類更具體,父類具有更一般的特徵和行爲,而子類除了具有父類的特徵之外還具有自己特有的特徵和行爲。
繼承的好處:
(1).代碼的複用
(2).爲了以後多態的使用
繼承來的東西:
(1).一般的屬性和方法被繼承
(2).構造方法不被繼承
(3).私有的方法不被繼承
(4)私有的屬性被隱藏,可以通過繼承來的公有方法訪問
(5).什麼時候建立父子類關係:任何A出現的地方,換做是B之後仍然成立,或者說:“B is a A”,如果符合這個公式,就可以建立父子類關係。
對於構造方法來使:
構造方法第一行不是super(...)就是this(...),如果一個構造方法第一行不是this(...)或super(...),則默認是對父類無參構造的調用super(...);不可能所有的構造都是this(...),至少有一個super(...);
注意:
在子類中使用和父類同樣名字的屬性沒有意義,對實際開發沒有任何好處,所以應該避免。
如果子類中有和父類名字相同的方法:
(1).如果參數不同,構成了重載
(2).如果參數相同,構成了重寫
重寫:覆蓋、複寫
(1).發生在父子類中
(2).同名同參同返回類型
(3).子類方法的修飾符不能比父類方法的修飾符更封閉。(要麼相同、要麼更開放)
(4)private--默認--protected--public
(5)子類方法拋出的異常不能比父類方法拋出的異常更寬泛
this()和super():
(1).this指本類對象
(2)Super指父類對象
a).可以通過super.來訪問父類的屬性或方法,屬性的話注意修飾符的作用範圍。
b).子類可以通過super(..)訪問父類的構造方法,給屬性賦值
c)如果子類構造方法中沒有對本類及父類構造方法的調用,則默認有super(...);
d)如果一個類沒有指定繼承其他父類,則它的父類是Object.
定義一個子類Cat在定義一個子類Dog都繼承自類Animals
Cat類:
public class Cat extends Animals{ //定義子類特有屬性 private String food; //定義子類特有屬性的get()/set()方法 public String getFood() { return food; } public void setFood(String food) { this.food = food; } public void Info(){ System.out.println("我是一隻小貓"); } }
Dog類:
public class Dog extends Animals{ //定義私有屬性 private String food; public void Infomation(){ System.out.println("我是一隻小狗"); } public String getFood() { return food; } public void setFood(String food) { this.food = food; } }
3.多態:一個對象,多種狀態。父類引用指向子類的對象。
多態的兩個基本原理:
(1).發生多態時,只能調用父類的方法,不能調用子類的方法
(2).發生多態時,如果子類中重寫了父類的方法,在調用這個方法,調用的是子類重寫之後的方法。
寫一個測試類TestAnimal:
public class TestAnimal { public static void main(String[] args) { //多態 Animals cat = new Cat(); //在子類Cat中重寫了父類Info()方法,所以在調用這個方法時,調用的是子類重寫之後的方法。 cat.Info(); //在子類Dog中沒有重寫父類的Info()方法,所以子類對象調用該方法時,調用的是父類的該方法 Animals dog = new Dog(); dog.Info(); //發生多態時,只能調用父類的方法,不能調用子類的方法.這裏Infomation()是子類的方法,所以發生多態是子類對象無法調用子類方法 //dog.Infomation(); } }
輸出結果:
我是一隻小貓
我是一隻動物