複製鏈接
請複製以下鏈接發送給好友

繼承

(面向對象的繼承)

鎖定
繼承面向對象軟件技術當中的一個概念,與多態封裝共為面向對象的三個基本特徵。繼承可以使得子類具有父類的屬性方法或者重新定義、追加屬性和方法等。
中文名
繼承
外文名
inheritance

繼承概念

繼承(英語:inheritance)是面向對象軟件技術當中的一個概念。這種技術使得複用以前的代碼非常容易,能夠大大縮短開發週期,降低開發費用。
繼承就是子類繼承父類的特徵和行為,使得子類對象(實例)具有父類的屬性和方法,或子類從父類繼承方法,使得子類具有父類相同的行為。
Java繼承是使用已存在的類的定義作為基礎建立新類的技術,新類的定義可以增加新的數據或新的功能,也可以用父類的功能,但不能選擇性地繼承父類。
子類的創建可以增加新數據、新功能,可以繼承父類全部的功能,但是不能選擇性的繼承父類的部分功能。繼承是類與類之間的關係,不是對象與對象之間的關係。
例如:先定義一個類叫車,車有以下屬性:車體大小、顏色、輪胎、方向盤、品牌、速度、排氣量,由車這個類派生出轎車和卡車兩個類,為轎車添加一個小後備箱,而為卡車添加一個大貨箱。
如果某類B“繼承”另某類A,就把這個B稱為“A的子類或派生類(subclass)”,而把類A稱為“B的父類”也可以稱為“A是B的超類或基類(superclass)”。
如果一個類別A“繼承自”另一個類別B,就把這個A稱為“B的子類別”,而把B稱為“A的父類別”也可以稱“B是A的超類”。
繼承可以使得子類別具有父類別的各種屬性和方法,而不需要再次編寫相同的代碼。在令子類別繼承父類別的同時,可以重新定義某些屬性,並重寫某些方法,即覆蓋父類別的原有屬性和方法,使其獲得與父類別不同的功能。另外,為子類別追加新的屬性和方法也是常見的做法。一般靜態的面向對象編程語言,繼承屬於靜態的,意即子類別的行為在編譯期就已經決定,無法在執行期擴充。
那麼如何使用繼承呢?用extends關鍵字來繼承父類。
如上面A類與B類,當寫繼承語句時,class A類 extends B類{ } 其中A類是子類,B類是父類。
繼承的語句格式:
class 子類名 extends 父類名{}
class 父類 { } class 子類 extends 父類 { }

繼承繼承關鍵字(keyword)

繼承可以使用 extends 和 implements 這兩個關鍵字來實現繼承,而且所有的類都是繼承於java.lang.Object,當一個類沒有繼承的兩個關鍵字,
則默認繼承object(這個類在 java.lang包中,所以不需要 import)祖先類。
1)extends關鍵字
在 Java 中,類的繼承是單一繼承,也就是説,一個子類只能擁有一個父類,所以 extends 只能繼承一個類。
public class Animal {
private String name;
private int id;
public Animal(String Name, String id) {
this.name= name;
this.id= id;
}
publicvoideat(){
System.out.println(name+"正在吃");
}
publicvoidsleep(){
System.out.println(name+"正在睡");
}
publicvoidintroduce() {
System.out.println("大家好!我是"+ id+ "號"+ name+ ".");
}
}
publicclassMouse extendsAnimal {
publicMouse(String myName, intmyId) {
super(Name, Id);
}
}
2)implements關鍵字
implements 關鍵字可以變相的使Java具有多繼承的特性,使用範圍為類實現接口的情況,可以同時實現多個接口(接口之間採用逗號分隔)。
publicinterfaceA {
publicvoideat();
publicvoidsleep();
}
publicinterfaceB {
publicvoidrun();
}
publicclassC implementsA,B {
}
3)final關鍵字
final可以修飾類、變量、方法。實例變量也可以被final修飾,被 final 修飾的變量在Java中就是常量,
被 final 修飾的類的屬性和方法自動地聲明為 final,但是被final修飾實例屬性和變量,並不能讓所在類變成final類
final 關鍵字聲明類可以把類定義為不能繼承的,即最終類;或者用於修飾方法,該方法不能被子類重寫:
聲明類:finalclass類名 {//類體}
聲明方法:修飾符(public/private/default/protected) final返回值類型 方法名(){//方法體}
4)static關鍵字
static修飾成員變量(屬性)和方法、代碼塊(不能出現在方法內部),static修飾變量(屬性)和方法,得到的是類變量和類方法,類變量和類方法用所在類的類名直接調用。static和abstract不能一起使用。
由static修飾的變量和方法,不能用this調用。靜態方法可以調用靜態的方法,普通方法也可以調用靜態方法,靜態方法不能調用普通方法。
5)this關鍵字
this 關鍵字在Java方法中只能用在實例變量和實例方法上,不能用在由static、final修飾的類變量和類方法上
如果在Java方法中,實例化的成員變量和某方法的參數變量同名時,根據內部屏蔽外部的原則,即實例化的成員變量在這個方法內暫時失效,
這時如果想在該方法中使用這被屏蔽的成員變量,用“this.成員變量名”的方式調用該成員變量,並且將參數變量賦值給this調用的成員變量,
格式如下:this.本類實例變量=參數變量;
public class Teacher {
private String name; // 教師名稱
private double salary; // 工資
private int age; // 年齡
// 創建構造方法,為上面的3個成員變量的屬性賦初始值
public Teacher(String name,int age,double salary) {
this.name = name; // 設置教師名稱
this.age = age; // 設置教師年齡
this.salary = salary; // 設置教師工資
}
//在一個構造器中調用另一個構造器
public Teacher(){
This("杜威",98,10000.0)
}
//當需要返回當前對象的引用時,常常使用return this。
publicStudent AgeIncrement(){
age+=2;
returnthis;
}
}
publicclassThisDemo{
public static void main(String[] args) {
Teacher teacher = new Teacher("王剛",5000.0,45);
System.out.println("教師信息如下:");
System.out.println("教師名稱:"+teacher.name+"\n教師年齡:"+teacher.age+"\n教師工資:"+teacher.salary);
}
}
用來訪問本類的成員方法:this.本類實例方法名
publicclassTest{
publicstaticvoidmain(String []args) {
SubClass subObject=newSubClass();
subObject.showMessage();
}
}
publicclassSuperClass {
intsum,i= 50,j=3;
intoperator(){
sum=i+j;
returnsum;
}
}
publicclassSubClass extendsSuperClass {
inti=100, j=6;
intoperator(){
sum=i+j;
returnsum;
}
publicvoidshowMessage() {
System.out.println("super.i = "+ super.i+ " ,this.i = "+ this.i);
System.out.println("super.operator() = "+ super.operator()+ " ,this.operator() = "+ this.operator());
}
}
6)super關鍵字:super是在子類中調用被屏蔽的成員變量和方法

繼承注意

1、子類擁有父類的特徵,而父類沒有,父類更通用,子類更具體(特徵包括屬性和方法,自身的特性,擁有父類沒有的)
2、使用extends繼承父類,語句格式:class 子類名 extends 父類名{}
3、父類中一般只定義一般屬性和方法(這個一般可以理解為是子類共有的,這就是父類更通用,而子類擁有其他的,所以子類更具體)
4、子類中通過super關鍵字來調用父構造方法
5、在子類中可以繼承父類的哪些東西,哪些不可以繼承
父類中public、protected修飾的屬性和方法可以繼承,private修飾的屬性和方法不能被繼承
6、規則:創建子類對象的時候,首先調用的是父類的無參構造方法創建一個父類對象
7、可以在子類中顯示調用父類的有參構造方法
8、如果父類的屬性均為private修飾,則可以通過共有的getter、setter方法來調用
有些編程語言支持多重繼承,即一個子類別可以同時有多個父類別,比如C++編程語言;而在有些編程語言中,一個子類別只能繼承自一個父類別,比如Java編程語言,這時可以利用接口來實現與多重繼承相似的效果。
現今面向對象程式設計技巧中,繼承並非以繼承類別的“行為”為主,而是繼承類別的“型態”,使得元件的型態一致。另外在設計模式中提到一個守則,“多用合成,少用繼承”,此守則也是用來處理繼承無法在執行期動態擴充行為的遺憾。