面向對象的三大特征:繼承 封裝 多態
阿新 • • 發佈:2018-04-08
ide args 使用 年齡 setsize return ring 關系 AR 面向對象:
面向對象專註於由誰來解決這個過程,而調用者無需關註對象實現的細節
編程特點: 出現了一個個的類,從類中拿到對象,通過對象直接解決問題
類:具有一系列相同屬性(特征)和方法(行為)的個體的集合 稱為類
類是一個抽象的概念,只能說類具有哪些屬性而不能直接對類進行賦值
例如 人類有身高這個屬性,但是不能說人類的身高是180
對象:從類中拿出具有具體屬性值的個體,稱為對象
對象是從類中拿出的一個具體的個體,需要對屬性進行具體的賦值
例如 人類有身高這個屬性,張三是人類的一個個體,就可以說張三身高是180 張三就是人類的一個對象
類和對象的關系
3.子類可以訪問父類的哪些屬性
①private 本類
②默認() 本類 本包
③protected 本類 本包 非同包子類
④public 本類 本包 非同包子類 其他包
子類可以訪問父類的構造方法
4.繼承後的初始化順序
樂器(Instrument)分為:鋼琴(Piano)、小提琴(Violin) 樂器(Instrument)包含品牌(brand)、重量(weight),
鋼琴(Piano)還包含尺寸(size),小提琴(Violin) )還包含長度(length) 各種樂器的彈奏( play )方法各不相同
在做類似題目時,最好按照以下步驟
- 類是對象的抽象化,對象是類的具體化
- 類是對象的描述,對象是類的個體(實例化)
- 程序中由類產生對象.
屬性的封裝(一般使用private關鍵字實現) 1.將類的屬性進行私有化處理,不允許外部程序直接訪問,並對外提供統一的方法用於設置和讀取私有屬性 2.實現訪問控制,限制屬性訪問,但不是拒絕訪問 封裝的作用 只能通過規定的方法訪問數據,方便在方法中加入控制語句,防止不合法數據賦值 封裝:除了屬性的封裝外,將需要重復使用的代碼提取到方法中,這叫方法的封裝 將相同的屬性和方法抽象成一個類,這也是封裝的思想
private int age; public void setAge( int age) {set 方法用來賦值 get方法用來讀值if (age>0&&age<100) { this.age=age; }else { System.out.println("輸入年齡不合法"); this.age=-1; } } public int getAge() { return this.age; }
並且可以在set方法中設置判斷條件,例如上例就是判斷年齡是否符合常識
類的繼承 1. 子類繼承父類 使用 extends 關鍵字 子類繼承父類 不能繼承父類的私有屬性 2.子類中需要訪問父類成員,使用super關鍵字 super.屬性 訪問父類屬性 super.方法() 訪問父類方法 如果,子類中沒有同名的屬性和方法覆蓋父類,則依然可以直接使用this.屬性調用從父類中繼承的非私有屬性 如果,子類中有同名的屬性和方法,this.屬性訪問的是本類 super.屬性訪問的是父類的屬性 在子類的構造函數中,直接使用super() 表示調用父類構造 而且super()函數必須在子類構造的第一行 註意 即使使用super關鍵字 也不能使用父類的私有屬性和私有方法- 父類屬性
- 父類構造方法
- 子類屬性
- 子類構造方法
②提高代碼的維護性。
③將類與類聯系起來,是多態的前提。
繼承只能單繼承,不能多重繼承,但是可以多層繼承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 )方法各不相同
在做類似題目時,最好按照以下步驟
- 發現類
- 發現類的屬性
- 發現類的方法
建一個父類(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()); }
運行結果為:
面向對象的三大特征:繼承 封裝 多態