二、封装、继承、多态

面向对象的三大特性

一、封装

概念:封装就是不提供内部具体实现细节,仅提供公共接口供外部使用
优点:(1)既允许外部使用成员变量,又使得外部不能随意修改成员变量。 (2) 保证数据安全


二、继承

概念:A类继承B类,则A为子类B为父类, A即可使用B的所有属性和方法。
优点:提高代码复用性。子类继承可以直接调用父类方法。
注意

  • 调用顺序: 子类父类方法同名,优先调用子类方法;
  • 子类可以重写父类方法,但是不能重写属性,否则报重复定义;

三、多态

概念:父类指针指向子类对象,即子类创建的对象将由父类接收。

  • 例子:Animal *a = [[Cat alloc]init]; [a eat]

条件

  • (1) 必须存在继承关系 , 如 猫继承动物;
  • (2) 子类必须重写父类方法;
  • (3) 父类指针指向子类对象; 如应由Cat类接收的改为Animal类;

原理动态绑定

  • 编译时,不会确定对象的类型,只会判断对象中是否具有方法。
  • 在运行时,会确定真正的对象类型,调用该对象的方法。 如[a eat];最终会转为[cat eat];

优点
提高代码的扩展性;父类可以调用子类的方法,之前的方法可以调用方法的代码;

注意点
(1) 多态必须满足三个条件才能使用;
(2) 子类进行方法重写,父类才能调用子类方法;
(3) 如果父类调用子类特有的方法sleep,必须进行强制类型转换。 Cat *c = (Cat*)a; [c sleep];

补充1. 为什么说Objective-C是一门动态编程语言 ?
答: 因为多态使OC 具有动态性,主要体现在三个方面。
(1) 动态类型: 即 id 类型,表示对象具体什么类型需要到运行时才能确定。
(2) 动态绑定: 对象绑定的方法,具体调用什么方法需要在运行时才能确定。
(3) 动态载入:不是在编译阶段把所有代码和资源加载进去,而是在运行时根据需要有选择的加载资源。

2. 静态数据类型与动态数据类型?

  • 静态数据类型 如 Person *p, 在编译阶段就能确定对象具体类型,具备哪些属性和方法;
  • 动态数据类型 即 id *p , 编译时并不知道对象具体类型,只有在运行时才能知道对象的类型和属性等;
  • id 类型的特点
    ** (1) 静态数据类型,不能直接调用子类特有的方法,若调必须进行强转;
    id类型 可以直接调用子类特有的方法;
    (2) id类型可以直接调用私有的方法。

测试存疑: id类型修饰对象,父类可以调用父类的私有方法,子类因为继承也可以调用父类的私有方法。
如果说父类不能调用子类的私有方法可以理解, 但是子类为什么不可以调用自己的私有方法?

  • id类型的应用场景和弊端
    应用: 很少,只有用到多态的时候,为了简化代码避免强制类型转换才会使用。
    弊端: 调用了不属于id所修饰对象的方法,编译不会报错但是运行会出错,运行时的错误较难排查。
    改进: 为了避免上述弊端,可以加一层判断,判断是否为该类型。如 Person和son类,son中具备sleep方法。
    id p = [[Person alloc]init];
    // [p sleep];
    
    if ([p isKindOfClass:[Son class]]){    // 如果不是Son类,就不会调用sleep方法,避免运行时崩溃
     [p sleep];
    }

四、self 与super

注:self 和 super 都是与类相关,方便方法的调用。

1. self

    self 调用如果在类方法中, self == 调用该类方法的那个类;
    self 调用如果在对象方法中, self == 调用该对象方法的那个对象;

场景:

  • 方便对象方法间相互调用;
  • 方便类方法间 的相互调用;

2. super

    super 调用如果在类方法中, super == 调用该类方法的那个类的父类;
    super 调用如果在对象方法中, super == 调用该对象方法的那个对象的父类对象;

场景:

  • 最常用: 子类使用super继承父类的方法,再自定义进行扩展。
   -(void)viewDidLoad{
       [super viewDidLoad];
       ...
      }

3.self 与 super 区别

    self 先去本类中查找方法,再去父类中找;
    super 直接去父类中查找是否有该方法;

辨析:

@implementation Son : Father
 - (id)init
 {
     self = [super init];
     if (self) {
         NSLog(@"%@", NSStringFromClass([self class]));
         NSLog(@"%@", NSStringFromClass([super class]));
     }
     return self;
 }
 @end

提示:需要结合RunTime
iOS Runtime面试题([self class] 与 [super class])

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值