extends與implements的使用和區別
extends 是繼承父類,只要那個類不是宣告final或者定義為abstract就能繼承,JAVA中不支援多重繼承,繼承只能繼承一個類,但implements可以實現多個介面,用逗號分開就行了。
比如:
class A extends B implements C,D,E(){ //class子類名extends父類名implements介面名
}
父類與子類繼承關係上的不同:
class A{ int i; void f(){ } } class B extends A{ int j; void f(){} //重寫方法 void g(){} }
B b=new B();
b就是子類物件的例項,不僅能夠方位自己的屬性和方法,也能訪問父類的屬性和方法。諸如b.i,b.j.b.fn()都是合法的。此時b.f()是B中的f()
A a=new B();
a雖然是用的B的建構函式,但經過upcast,成為父類物件的例項,不能訪問子類的屬性和方法。a.i,a.f()是合法的,而a.j,a.g()是非法的。此時訪問a.f()是訪問B中的f();
實現過程
A a = new B(); 這條語句,實際上有三個過程:
(1) A a;
將a宣告為父類物件,只是一個引用,未分配空間
(2) B temp = new B();
通過B類的建構函式建立了一個B類物件的例項,也就是初始化
(3) a = (A)temp;
將子類物件temp轉換未父類物件並賦給a,這就是上傳(upcast),是安全的。
經過以上3個過程,a就徹底成為了一個A類的例項。
子類往往比父類有更多的屬性和方法,上傳只是捨棄,是安全的;而下傳(downcast)有時會增加,通常是不安全的。
多型
a.f()對應的應該是B類的方法f()
呼叫建構函式建立例項後,對應方法的入口已經確定了。
如此一來,a雖被上傳為A類,但其中重寫的方法f()仍然是B的方法()。也就是說,每個物件知道自己應該呼叫哪個方法。
A a1 = new B();
A a2 = new C();
a1,a2兩個雖然都是A類物件,但各自的f()不同。這正是多型性的體現。
作者:guazi1020
連結:https://www.jianshu.com/p/ce75d982dd3b
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯絡作者獲得授權並註明出處。