思考:當(dāng)多個(gè)類,擁有部分相同的成員變量時(shí)懊烤,怎么辦爷光?
1.復(fù)制-粘貼
缺點(diǎn):當(dāng)需求有任何改動(dòng)時(shí),需要改動(dòng)的代碼量很大缓屠,很不方便。
2.繼承:@interface類名:要繼承的類名????? 目的:降低代碼冗余度
繼承的效果:子類繼承父類护侮,就無條件擁有了父類的所有成員變量
私有成員變量:寫在.m中的成員變量敌完,叫做私有成員變量,只能在本類中訪問羊初,但能被繼承
子類不可以定義與父類同名的成員變量
OC不支持多繼承滨溉,支持多層繼承
==>繼承體系中方法調(diào)用順序
1.在自己類中尋找
2.如果沒有,如父類中找
3.如果父類中沒有长赞,就去父類的父類
4.如果父類的父類還沒有晦攒,就繼續(xù)往上找,直到找到基類(NSObject)
5.如果NSObject也沒有就報(bào)錯(cuò)了
==>繼承的準(zhǔn)則
不要為了僅僅只是得到某一個(gè)類的成員而去繼承
不要為了繼承而繼承
語法上其實(shí)任意的類之間都是可以繼承的
清理得哆、邏輯上并不是任意的類之間都是可以繼承的
只有滿足isa關(guān)系對(duì)象的才可以擁有繼承關(guān)系
當(dāng)A類是一個(gè)B類的時(shí)候脯颜,這個(gè)時(shí)候A類才可以從B類去繼承
只有子類是一個(gè)父類的時(shí)候,才可以繼承
-->繼承具有傳遞性贩据。
-->new
實(shí)際上是一個(gè)定義在NSObject中的一個(gè)類方法
這個(gè)方法用來創(chuàng)建對(duì)象
所以栋操,如果我們的類想要擁有創(chuàng)建對(duì)象的能力,就必須間接或者直接的從NSObject類繼承
NSObject類中還有一個(gè)isa屬性
所以我們的對(duì)象中都有一個(gè)isa屬性
super關(guān)鍵字介紹
1.self和super
OC提供了兩個(gè)保留字self和super饱亮,用于在方法定義中引用執(zhí)行該方法的對(duì)象
OC語言中的self矾芙,就相當(dāng)于C++、Java中的this指針近上。學(xué)會(huì)使用self剔宪,首先要搞清楚屬性這一概念,以及理解getter(設(shè)置器)和setter(訪問器)方法壹无,它到底有什么用葱绒?
設(shè)置器和訪問器,供外界操作格遭,類內(nèi)部屬性的一個(gè)通道
假如哈街,沒有這個(gè)方法,外界怎么操作類的內(nèi)部屬性拒迅。加入不提供這兩個(gè)方法骚秦,那么這個(gè)屬性的值就不能為外界所改變她倘,因?yàn)轭惖膶傩阅J(rèn)是@protect(受保護(hù)類型)。屬性一般是私有的
super:只調(diào)用父類方法作箍,涉及到成員變量還是用的子類自己的硬梁。
2.super應(yīng)用場景
1)應(yīng)用在對(duì)象方法中
調(diào)用對(duì)象父類的對(duì)象方法
2)用在類方法中
調(diào)用類的父親的類方法
成員變量修飾符
1.@public:(公開)只要導(dǎo)入頭文件,任何位置都可以訪問
2.@protected:(半公開)可以在本類和子類當(dāng)中進(jìn)行訪問
3.@private:(私有)只能在本類當(dāng)中進(jìn)行訪問胞得,子類無法進(jìn)行訪問賦值荧止,但是子類可以繼承到
4.@package:(半公開)在同一框架內(nèi),可以直接訪問阶剑。
-->在.h文件當(dāng)中聲明的@private的成員變量跃巡,子類無法進(jìn)行重新定義
私有方法
父類當(dāng)中在.m文件當(dāng)中直接進(jìn)行實(shí)現(xiàn),但是沒有在.h文件當(dāng)中進(jìn)行聲明的方法牧愁,我們叫做私有方法素邪。
1)不能夠在外界進(jìn)行訪問。
2)不能在子類進(jìn)行訪問猪半。
3)父類私有的方法在子類中可以定義同名方法
4)私有方法不可以被子類繼承
多態(tài)
不同的對(duì)象以自己的方式相應(yīng)相同名稱方法的能力稱為多態(tài)
多態(tài)的條件
有繼承關(guān)系兔朦、有方法重寫
父類的聲明變量指向子類對(duì)象
如:狗 *g
= [狗 new];
?????? 動(dòng)物 *a = [狗 new];
貓 *c = [貓 new];
動(dòng)物 *a = [貓 new];
多態(tài)的優(yōu)點(diǎn)
多態(tài)的主要好處就是簡化了編程接口。它容許在類和類之間重用一些習(xí)慣性的命名磨确,而不用為每一個(gè)新加的函數(shù)命名一個(gè)新名字沽甥。醬,編程接口就是一些抽象的行為的集合乏奥,從而和實(shí)現(xiàn)接口的類區(qū)分開來
多態(tài)也使得代碼可以分散在不同的對(duì)象中而不用試圖在一個(gè)函數(shù)中考慮到所有可能的對(duì)象摆舟。這樣使得您的代碼擴(kuò)展性和復(fù)用性更好一些。當(dāng)一個(gè)新的情景出現(xiàn)時(shí)英融,您無須對(duì)現(xiàn)有的代碼進(jìn)行改動(dòng)盏檐,而只需要增加一個(gè)新的類和新的同名方法歇式。
為什么父類可以訪問子類繼承自父類的方法驶悟,但是無法訪問子類獨(dú)有的方法?
1.編譯器編譯時(shí)材失,只檢查指針變量的類型痕鳍,確定該指針變量類型里面有下面調(diào)用的方法,如果有該方法龙巨,編譯器就認(rèn)為是正確笼呆,可以編譯通過。
2.運(yùn)行時(shí)旨别,會(huì)動(dòng)態(tài)監(jiān)測對(duì)象的真實(shí)類型诗赌。然后調(diào)用對(duì)象自己的方法。
3.使用強(qiáng)制類型轉(zhuǎn)換可以訪問子類獨(dú)有的方法
如:Animal
*c = [Cat new];
??????[(Cat *)c jump];
[面試重點(diǎn)]OC運(yùn)行時(shí):OC不同于傳統(tǒng)程序設(shè)計(jì)語言秸弛,它可以在運(yùn)行時(shí)加入新的數(shù)據(jù)類型和新的程序模塊:動(dòng)態(tài)類型識(shí)別铭若,動(dòng)態(tài)綁定洪碳,動(dòng)態(tài)加載。
【了解】類對(duì)象
1.類對(duì)象的類型:Class類型
2.如何創(chuàng)建類對(duì)象
1)Class 類對(duì)象名 = [類名 class]叼屠;
2)類名 *對(duì)象名 = [類名 new]瞳腌;
?????Class 類對(duì)象名 = [對(duì)象名 class];
3.類對(duì)象只能調(diào)用類方法镜雨。
4.類對(duì)象不能訪問成員變量
【了解】SEL類型
1.SEL類型
SEL:全稱selector嫂侍,一種用來表示方法名類型的數(shù)據(jù)類型(方法名)。
SEL類型作用:
1)可以定義變量
2)可以用來作為方法的形參
3)可以用來作為方法的實(shí)參
類中方法存儲(chǔ)的原理
1)類里面的方法都是被轉(zhuǎn)換成SEL變量進(jìn)行存儲(chǔ)的荚坞。
2)當(dāng)類聲明一個(gè)對(duì)象挑宠,對(duì)象調(diào)用方法的時(shí)候,系統(tǒng)會(huì)把這個(gè)方法轉(zhuǎn)換成SEL颓影,然后拿著這個(gè)SEL到類方法中去匹配
[d run]; --->SEL
用法:SEL 名稱 = @selector(方法)痹栖;
調(diào)用:[對(duì)象
performSelector:SEL類型的數(shù)據(jù)];
Student *s = [Student new];
? ? ? ? //[s student];
? ? ? ? SEL s1 = @selector(student);
? ? ? ? SEL s2 = @selector(studyWithAge:);
? ? ? ? BOOL res = [Student
instancesRespondToSelector:s1];
? ? ? ? NSLog(@"%d",res);
Static在OC中的用法
static修飾局部變量:延長局部變量的生命周期
static修飾全局變量:當(dāng)前變量只能在當(dāng)前文件中使用
static修飾函數(shù):函數(shù)只能在當(dāng)前文件中使用
不能修飾實(shí)例變量
不能修飾方法
static@interface和@end之間是不被允許的
static的使用場合
1)可以定義全局變量,但是只能在Dog.m中使用
2)可以定義局部變量和C語言一樣瞭空,延長變量生命周期