繼承可以被定義為一個對象獲取另一個對象屬性的過程。使用繼承可以使信息以繼承順序有序管理。
當我們談?wù)撈鹄^承,最常用的關(guān)鍵字應(yīng)該為 extends 和 implements。 這些關(guān)鍵字將決定一個對象是否是 A 類型或是其他類型。通過使用這些關(guān)鍵字,我們可以使一個對象獲得另一個對象的屬性。
IS-A 是說:這個對象所屬于另一個對象。讓我們來看怎么用關(guān)鍵字 extends 來實現(xiàn)繼承。
public class Animal{
}
public class Mammal extends Animal{
}
public class Reptile extends Animal{
}
public class Dog extends Mammal{
}
現(xiàn)在,基于上面的例子,在面向?qū)ο缶幊讨?請遵循以下幾點:
現(xiàn)在,針對 IS-A 關(guān)系,我們可以說:
使用關(guān)鍵字 extends,子類可以繼承父類除了私有屬性的所有屬性。
使用 instance 操作我們可以保證 Mammal 實際上是一個 Animal。
public class Dog extends Mammal{
public static void main(String args[]){
Animal a = new Animal();
Mammal m = new Mammal();
Dog d = new Dog();
System.out.println(m instanceof Animal);
System.out.println(d instanceof Mammal);
System.out.println(d instanceof Animal);
}
}
這將得到如下結(jié)果:
true
true
true
我們已經(jīng)很好理解了 extends 關(guān)鍵字,讓我們來看 implements 關(guān)鍵字是如何確立 IS-A 關(guān)系的。
implements 關(guān)鍵字,是在類繼承接口的時候使用的。接口是不能被類使用 extends 繼承的。
public interface Animal {}
public class Mammal implements Animal{
}
public class Dog extends Mammal{
}
讓我們使用 instanceof 操作符來檢查確定是否 Mammal 實際上是 Animal, dog 實際上是一種Animal。
interface Animal{}
class Mammal implements Animal{}
public class Dog extends Mammal{
public static void main(String args[]){
Mammal m = new Mammal();
Dog d = new Dog();
System.out.println(m instanceof Animal);
System.out.println(d instanceof Mammal);
System.out.println(d instanceof Animal);
}
}
這將產(chǎn)生如下結(jié)果:
true
true
true
該關(guān)系是基于使用方便的。這決定了一個類是否含有 A 的一些屬性。該關(guān)系幫助減少代碼重復(fù)和漏洞的出現(xiàn)。
讓我們看下面的例子:
public class Vehicle{}
public class Speed{}
public class Van extends Vehicle{
private Speed sp;
}
這個例子表明 Van 含有 Speed.因為我們單獨定義了 Speed 類,我們不必將整個 Speed 類的代碼加入 Van 類,使其在多個應(yīng)用程序中重用 Speed 類。
在面向?qū)ο笾校脩舨挥萌タ紤]哪一個對象在做實際的工作。為了實現(xiàn)這個功能, Van 類向用戶隱藏了實現(xiàn)具體細節(jié)的類。當用戶讓 Van 類去做一項工作時,Van 類或者自己來做,或者求助其他類來做這項工作。
請記住一個非常重要的事實,Java 只支持單繼承,這意味著一個類只能繼承一個類,所以以下的是非法的:
public class extends Animal, Mammal{}
然而,一個類可以實現(xiàn)一個或多個接口,這使得 Java 可以擺脫不能多繼承的問題。