當咱們建立一個類的對象後,能夠經過對象.屬性的方式,對對象進行賦值。 這裏,賦值操做受到屬性的數據類型和存儲範圍的制約,除次以外,沒有其餘制約條件。 可是,在實際問題中,咱們每每須要給屬性賦值加入額外的限制條件,這個條件又不能在屬性聲明時體現
,咱們只能經過一個public 方法對屬性進行限制條件的添加(get(),set())
同時,咱們須要避免用戶再使用「對象.屬性」進行賦值,則須要將屬性聲明爲私有化。
--》此時,針對屬性就體現了封裝。ide
(1)類的內部數據操做細節本身完成,不容許外部干涉。僅對外暴露少許的方法用於使用
(2)隱藏對象內部的複雜性。只對外公開簡單的接口。便於外界調用,從而提升系統的可擴展性、可維護性。
(3)封裝性的設計思想:把該隱藏的隱藏起來,該暴露的暴露出來
例如:模塊化
public class Animal{ int age;//年齡可能被賦爲負數,不符合實際 int legs;//腿有可能被賦爲負數或奇數個,不符合實際 } 因此能夠給屬性設置一個get()和set()方法,來添加限制條件,並獲取和設置相應的屬性值,以下: public class Animal{ private int age; private int legs; //對屬性的設置 publci void setAge(int age){ if(age>=0){ this.age=age; } //對屬性的獲取 public int getAge() { return age; } //對屬性的設置 public void setLegs(int leg){ if(leg>=0&&leg%2==0){ legs=leg; }else{ legs=0; } } //對屬性的獲取 public int getLegs(){ return legs; } }
但僅這樣還不夠,由於用戶仍是能夠經過「對象.屬性」的方式更改屬性值,因此,爲了不者中狀況發生,要將相應的屬性私有化,只對外留下public方法來供用戶對屬性進行使用。
(1)將類的屬性私有化,同時提供public方法來獲取和設置此屬性的值
(2)不對外暴露的私有的方法
(3)單例模式(構造器私有化)this
(1)Java的四種權限:
private 缺省 protected public
(2)4種權限能夠用來修飾類及類的內部結構(屬性、方法、構造器、內部類)
(3)具體的:4種均可以修飾類的內部結構
修飾類:缺省,public設計
(1)減小了代碼的冗餘,提升了代碼的複用性
(2)便於功能的擴展
(3)爲以後多態性的使用,提供了前提code
一旦子類繼承了父類。子類就獲取了父類的全部屬性和方法,包括私有private方法或屬性
證實:
私有屬性:經過get()\set(int i)來進行設置和獲取
私有方法:將私有方法放在public方法中仍是能夠被調用的對象
(1)子類重寫的方法的方法名和形參列表與父類被重寫的方法的方法名和形參列表相同
(2)子類重寫的權限不小於父類(特殊:子類不能重寫private方法)
(3)子類重寫方法拋出的異常類型不大於父類
(4)返回值類型:
a.父類被重寫的方法類型是void,子類重寫也是void
b.父類被重寫的方法類型是A,子類重寫方法能夠是A或A的子類
c.父類被重寫的方法類型是基本數據類型,子類重寫方法也是相同的基本數據類型
(5)不能重寫static方法blog
(1)父類的狀況不適用於子類
例如:(圓柱體類繼承圓類)圓求面積,但圓柱體求表面積
(2)操做的多樣化繼承
(1)從定義看:
重載(同一個類中,繼承類):方法名相同,形參列表不一樣,返回值能夠不一樣,權限符能夠任意不一樣
重寫(繼承類):方法名,形參列表相同,返回值,權限符與父類的有關
(2)從編譯和運行的角度
重載(不表現爲多態性):容許存在多個同名的方法,編譯器根據方法的不一樣的參數列表進行區分,對編譯器而言,這些同名方法就成了不一樣的方法,所以它們的調用地址在編譯期間就肯定了
重載:早綁定,靜態綁定
重寫:能夠理解爲多態,動態綁定,晚綁定,只有在運行時,才知道調用的對象是父類仍是子類的
(3)static:重載能夠,重寫不行
static 隨着類的加載加載,不能被覆蓋
(4)構造器能夠重載不能重寫接口
(1)調用屬性,方法
a.通常省略
b.子類、父類有同名屬性時,要用super.屬性來指明是調用父類的屬性
c.子類重寫父類方法後,在子類方法中調用父類被重寫的方法時,要用super.方法
(2)調用構造器
super(參數1,參數2,...)內存
一個事物的多種形態
(1)對象的多態性:(向上轉型)編譯看左(父類),運行看右(子類),調用虛擬方法
①父類引用指向子類對象,當調用子父類同名參數的方法時,實際執行的是子類重寫父類的方法---虛擬方法調用
虛擬方法:在多態的狀況下,父類的方法稱爲虛擬方法,父類根據賦給它的不一樣子類對象,
動態調用屬於子類的該方法,這樣的方法在編譯時是不肯定的
②若是子類沒有重寫該方法,則執行父類的方法.
③該子類對象不能調用自身的特有方法(編譯會看左邊的父類)
class Animal{ public void walk(){ System.out.println("動物跑"); } } class Cat extends Animal { @Override public void walk() { System.out.println("喵喵走路"); } public class AnimalTest { public static void main(String[] args) { Animal cat=new Cat();//父類引用指向子類對象 cat.walk();//調用walk()方法,執行的是子類重寫的walk方法 } }
(2)對象的多態性只適用於方法不適用於屬性,屬性都看左邊的父類
(1)類的繼承關係
(2)要有方法的重寫
能夠經過傳入不一樣的對象來控制不一樣的特徵結果
內存中其實是加載了子類特有的屬性和方法,可是因爲變量聲明爲父類類型,
致使編譯時,只能調用父類中聲明的屬性和方法,子類特有的屬性和方法不能調用
強制類型轉換,(向下轉型)將父類引用指向的對象轉爲爲子類類型,可能會出現ClassCastException異常,
解決方法:instanceof
(1)a instanceof A:判斷對象a是不是A的實例,若是true就向下轉型
Animal cat=new Cat(); if(cat instanceof Cat){ Cat cat1=(Cat)cat; cat1.eat(); }
(2)若是 a instanceof A:爲true,a instanceof B也爲true,則B是A的父類