OC-继承与多态

思考:当多个类,拥有部分相同的成员变量时,怎么办?

1.复制-粘贴

缺点:当需求有任何改动时,需要改动的代码量很大,很不方便。

2.继承:@interface类名:要继承的类名      目的:降低代码冗余度


继承的效果:子类继承父类,就无条件拥有了父类的所有成员变量


私有成员变量:写在.m中的成员变量,叫做私有成员变量,只能在本类中访问,但能被继承


子类不可以定义与父类同名的成员变量

OC不支持多继承,支持多层继承


==>继承体系中方法调用顺序

1.在自己类中寻找

2.如果没有,如父类中找

3.如果父类中没有,就去父类的父类

4.如果父类的父类还没有,就继续往上找,直到找到基类(NSObject)

5.如果NSObject也没有就报错了


==>继承的准则

不要为了仅仅只是得到某一个类的成员而去继承

不要为了继承而继承

语法上其实任意的类之间都是可以继承的

清理、逻辑上并不是任意的类之间都是可以继承的

只有满足isa关系对象的才可以拥有继承关系

当A类是一个B类的时候,这个时候A类才可以从B类去继承

只有子类是一个父类的时候,才可以继承


-->继承具有传递性。


-->new

实际上是一个定义在NSObject中的一个类方法

这个方法用来创建对象

所以,如果我们的类想要拥有创建对象的能力,就必须间接或者直接的从NSObject类继承

NSObject类中还有一个isa属性

所以我们的对象中都有一个isa属性


super关键字介绍


1.self和super

OC提供了两个保留字self和super,用于在方法定义中引用执行该方法的对象

OC语言中的self,就相当于C++、Java中的this指针。学会使用self,首先要搞清楚属性这一概念,以及理解getter(设置器)和setter(访问器)方法,它到底有什么用?

设置器和访问器,供外界操作,类内部属性的一个通道

假如,没有这个方法,外界怎么操作类的内部属性。加入不提供这两个方法,那么这个属性的值就不能为外界所改变,因为类的属性默认是@protect(受保护类型)。属性一般是私有的

super:只调用父类方法,涉及到成员变量还是用的子类自己的。

2.super应用场景

1)应用在对象方法中

调用对象父类的对象方法

2)用在类方法中

调用类的父亲的类方法





成员变量修饰符

1.@public:(公开)只要导入头文件,任何位置都可以访问

2.@protected:(半公开)可以在本类和子类当中进行访问

3.@private:(私有)只能在本类当中进行访问,子类无法进行访问赋值,但是子类可以继承到

4.@package:(半公开)在同一框架内,可以直接访问。


-->在.h文件当中声明的@private的成员变量,子类无法进行重新定义


私有方法

父类当中在.m文件当中直接进行实现,但是没有在.h文件当中进行声明的方法,我们叫做私有方法。

1)不能够在外界进行访问。

2)不能在子类进行访问。

3)父类私有的方法在子类中可以定义同名方法

4)私有方法不可以被子类继承


多态


不同的对象以自己的方式相应相同名称方法的能力称为多态


多态的条件

有继承关系、有方法重写

父类的声明变量指向子类对象


如:狗 *g

= [狗 new];

       动物 *a = [狗 new];


猫 *c = [猫 new];

动物 *a = [猫 new];


多态的优点

多态的主要好处就是简化了编程接口。它容许在类和类之间重用一些习惯性的命名,而不用为每一个新加的函数命名一个新名字。酱,编程接口就是一些抽象的行为的集合,从而和实现接口的类区分开来


多态也使得代码可以分散在不同的对象中而不用试图在一个函数中考虑到所有可能的对象。这样使得您的代码扩展性和复用性更好一些。当一个新的情景出现时,您无须对现有的代码进行改动,而只需要增加一个新的类和新的同名方法。


为什么父类可以访问子类继承自父类的方法,但是无法访问子类独有的方法?

1.编译器编译时,只检查指针变量的类型,确定该指针变量类型里面有下面调用的方法,如果有该方法,编译器就认为是正确,可以编译通过。

2.运行时,会动态监测对象的真实类型。然后调用对象自己的方法。

3.使用强制类型转换可以访问子类独有的方法

如:Animal

*c = [Cat new];

      [(Cat *)c jump];

[面试重点]OC运行时:OC不同于传统程序设计语言,它可以在运行时加入新的数据类型和新的程序模块:动态类型识别,动态绑定,动态加载。


【了解】类对象


1.类对象的类型:Class类型

2.如何创建类对象

1)Class 类对象名 = [类名 class];

2)类名 *对象名 = [类名 new];

     Class 类对象名 = [对象名 class];

3.类对象只能调用类方法。

4.类对象不能访问成员变量


【了解】SEL类型

1.SEL类型

SEL:全称selector,一种用来表示方法名类型的数据类型(方法名)。

SEL类型作用:

1)可以定义变量

2)可以用来作为方法的形参

3)可以用来作为方法的实参

类中方法存储的原理

1)类里面的方法都是被转换成SEL变量进行存储的。

2)当类声明一个对象,对象调用方法的时候,系统会把这个方法转换成SEL,然后拿着这个SEL到类方法中去匹配

[d run]; --->SEL


用法:SEL 名称 = @selector(方法);

调用:[对象

performSelector:SEL类型的数据];

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修饰全局变量:当前变量只能在当前文件中使用

static修饰函数:函数只能在当前文件中使用


不能修饰实例变量

不能修饰方法

static@interface和@end之间是不被允许的


static的使用场合

1)可以定义全局变量,但是只能在Dog.m中使用

2)可以定义局部变量和C语言一样,延长变量生命周期

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容

  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 1,678评论 0 9
  • OC基础总结 重新回过头看这些基础知识,对许多知识点都有新的认识,拥有坚实的基础才能更快的成长。 #improt ...
    xx_cc阅读 6,015评论 10 56
  • 1.面向对象三大特性 -封装性 -继承性 -多态性 2.什么是封装 封装性就是隐藏实现细节,仅对外公开接口。 3....
    梦夜繁星阅读 1,082评论 0 6
  • 面向对象三大特性:封装、继承、多态面向对象三大特性 继承 在OC中,继承为单继承。即每个类只能有一个父类,子类自动...
    swuzjb阅读 334评论 0 0
  • 文/淑影看了《我的前半生》,印象很深的是贺涵评价子君一家人的生活状态:你们一家人都在用力的生活着。 这句话,是真理...
    淑影阅读 486评论 2 10