OC基础第三章: 继承 、 封装、多态

一、 继承
继承定义: 子类拥有了父类的属性和方法.

派生: 父类向下产生子类的过程称为派生

继承的注意事项:
1. 子类不能定义和父类同名的变量,但是可以继承父类的变量
2. OC类支持单一继承,不支持多继承
3)、基类的私有属性能被继承,但不能被使用

实例变量修饰符在子类中的引用问题:
1>、@public类型的变量在子类可以正常的访问和使用。
2>、@protected类型的变量在子类中使用,不能在其他类中使用
3>、@private 类型 的变量可以被子类继承,但是不能被访问
OC中的私有变量:
1、 私有变量,在.m中@implementation {}中定义的都是私有变量 ,不能被继承,只能被当前类使用。
补充:在任何情况下.m文件都不要去引用。
实例变量不能被static 、extern修饰
2、 私有方法:,在.h中没有声明,但是在.m中实现的这一类方法就是私有方法。不能被子类继承和访问。
[self test]可以访问私有方法,只有在当前文件就可以访问。

2、 description的介绍和用法
1、description的作用::当我们以%@的格式打印了对象d时,此时调用了对象的description方法,对象中如果没有description方法就去它的父类去找,直到找到基类(NSObject)。
2、如果不重写description打印就是对象的地址
3、但是重写description用户可以自定义去设置打印内容。
重写子类

的类方法Description
1、在类方法中不能访问实例变量,不可以出现实例变量
2、但是可以返回你想输出的信息。
3. 千万不要在description方法中同时使用%@和self
- (NSString *)description {
return [NSString stringWithFormat:@”%@”, self];
}
同时使用了%@和self,代表要调用self的description方法,因此最终会导致程序陷入死循环,循环调用description方法

3、self和super
1. self理解: 谁调用当前方法, self就代表谁.
比如: 在对象方法中,self代表的是对象, 因为只有对象才可以调用对象方法
在类方法中, self代表的是类, 因为只有类名才可以调用类方法.

注意: 在对象 方法中不要使用self调用类方法
在类方法中不要使用self调用对象方法

  1. 获取当前对象的类: Person *p = [Person p];
    [p class] = [Person class] = Person

  2. 在对象方法中可以通过 self->_speed访问成员变量.

  3. super代表的是当前类的父类.

4.匿名对象
匿名对象的使用场景: 当对象的方法只调用一次时,可以使用匿名对象来完成。
匿名对象优缺点 :
优点: 可以简化代码,方便方法调用;节省内存空间
缺点: 匿名对象实例化以后,只能正确的使用一次成员变量;
二、封装

一、封装
1.什么是封装:
封装是指隐藏对象的属性和实现细节,仅对外提供公共访问方式

2.封装的好处:
将变化隔离。(不管里面怎么变,使用者不需要知道)
便于使用。(使用者只需按照一定的方法使用就可以了)
提高重用性。(任何人都可以对已封装好的功能进行操作)
提高安全性。(由于暴露给使用者的只是一些外在的操作环节,而不是里面本质的东西,所以就提高了对他的维护性,也就是安全性)

3.封装的原则:
将不需要对外提供的内容都隐藏起来。
把属性都隐藏,提供公共方法对其访问。
二、static关键字的用法
一、  static关键字在OC中的使用
static在C语言中 可以修饰局部变量 、全局变量 、函数
static在OC中:
1static在OC中不能修饰实例变量
2、可以修饰全局变量,只能在本文件中去使用
3、不能修饰方法(注意和其他语言的区别)
4、可以修饰局部变量(和C中的用法一样)

三、多态
一. 多态
1. 多态概念,定义
什么是多态:多态就是某一类事物的多种形态;
表现形式: Animal *ani = [Dog new];
多态条件:1.有继承关系 2.有方法的重写

2.多态代码实现:
//实例化猫的对象
Animal *animal = [Cat new]; //父类的指针指向子类对象;
[animal eat];

//实例化狗的对象
animal = [Dog new]; //父类的指针指向子类对象。
[animal eat];

3.多态注意点:
1) 如果存在多态,父类是可以访问子类特有的方法
假设子类Dog 有一个特有的方法bark
Animal *an2 = [Dog new]; //编译时看等号左边,运行时看等号右边
[(Dog*)an2 bark]; //把父类的指针,强制类型转换

2) 如果不存在多态,父类是不可以访问子类特有的方法的
Animal *an3 = [Animal new];
[(Dog*)an3 bark]; //错误的,不能强制转换

二、类对象
1,类的本质其实也是一个对象(类对象);
类对象
*类对象在程序运行时一直存在。
*类对象是一种数据结构,存储类的基本信息:类大小,类名称,类的版本以及消息与函数的映射表等
*每一个对象都包含一个指向其类对象的isa指针。

2、类对象如何获取
通过实例对象获取
Dog *d1 = [Dog new];
Dog *d2 = [Dog new];
Class c = [d1 class];
Class c2 = [d2 class];

通过类名获取(类名其实就是类对象)
Class c3 = [ Dog class ];

因为类对象在整个程序中只存在一份,
所以 c = c2 = c3

3.类对象的使用
1)可以用来调用类方法 :
//获取类对象
Class c1 = [Person class];
//使用类对象调用类方法
[c1 test]; // test是一个+号方法

2)可以用来实例化实例对象, 并且调用对象方法
//获取类对象
Class c1 = [Person class];
//使用类对象创建实例对象
Person *p = [c1 new];
[p test]; // -test 调用对象方法

  1. 类对象存储细节
    通过打印地址分析测试:类对象存在数据段;

5.SEL类型
SEL是一种新的数据类型。和id、class一样。
Person *p = [Person new];
SEL s1 = @selector(test);//把方法放到选择器中
[p performSelector:s1];//通过选择器访问对象p的test方法。。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值