運行時多態(tài)
重寫override
重寫方法
沒有重寫的方法會被重寫
沒有重寫的方法中調(diào)用已經(jīng)重寫的方法會調(diào)用重寫后的新方法而不是父類中的舊方法
把指針的聲明類型Rectangle改成Shape也不會有任何影響,因為聲明類型不重要雀瓢,重要的是指針實際指向的類型
屬性也可以重寫,但本質(zhì)上屬性背后的訪問器方法被override
重載
方法名相同,參數(shù)不同不可以共存
方法名(參數(shù)名)不同柱搜,參數(shù)相同可以共存
因此OC不支持方法重載
super僅指父類(Shape)普泡,沒有多態(tài)性
相比之下粱哼,self有多態(tài)性,可以指向不同子類狐粱,即在不同的子類(Circle,Rectangle)中會調(diào)用各個子類的方法
內(nèi)存模型
rect-》Rectangle Class(類)-》methodList-》各種方法(draw胆数,print)
因此肌蜻,多態(tài)調(diào)用涉及地址的動態(tài)辨析,但這種模式的代價是效率較低
繼承中的初始化器和析構(gòu)器
子類自動繼承基類的初始化器
子類也可以重寫基類的初始化器(如Shape重寫了NSObject的初始化器必尼,而Rectangle則重寫了?Shape的初始化器)但此時必須手動調(diào)用基類的初始化器self=[super init]蒋搜;
析構(gòu)器也可以繼承或重寫,子類析構(gòu)器運行后會自動后置調(diào)用基類析構(gòu)器判莉,同時不可以手動調(diào)用
子類析構(gòu)器也具有多態(tài)性
注意:避免在父類的init或dealloc中調(diào)用子類重寫的方法豆挽,否則子類重寫的init在繼承基類的init時調(diào)用的是子類中重寫后的方法,而重寫后的方法中可能包含尚未在子類init中初始化的實例變量券盅。而dealloc中也不要調(diào)用子類的方法帮哈,因為子類已經(jīng)被釋放