思考:当多个类,拥有部分相同的成员变量时,怎么办?
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语言一样,延长变量生命周期