继承与多态 类对象

IOS学习第21天

继承

  • NSObject类
1.NSObject 是什么?
    是一个类,是所有类的根类

2.为什么要继承NSObject
    因为所有类需要创建对象,需要用一个new来创建对象,而这个new方法它是在NSObject类中定义
    不仅仅是用new方法,还有一些其他方法,比如dealloc,description..都在NSObject中定义
    ```

* super关键字

1.在对象方法中使用super关键字
在子类的对象方法中,需要调用从父类继承过来的对象方法
a.[self 方法名]
b.[super 方法名];//显示告诉程序员 这个方法是从父类继承

2.在类方法中使用super关键字
在子类的类方法中,需要调用从父类继承过来的类方法
[子类名 类方法名]
[父类名 类方法名]
[self 类方法名];
[super 类方法名];//显示告诉程序员,这个类方法是从父类继承来的
“以后如果在子类中 需要调用从父类继承过来的方法

“我们建议 有super来调用

3.super关键字 不能访问属性,只能调用方法


* 属性的访问修饰符

1.是什么?
是关键字,用来修饰类在.h中直接声明的属性
@public 共用的
@protected 受保护的
@private 私有的
@package 框架级别

2.有什么用
一个类的.h中直接声明的属性用这四种关键字修饰,可以限制属性在当前类和子类中的访问权限.

3.分别有什么作用
“无论是什么属性修饰符,属性都是会被子类继承

所谓的类的内部,就是在当前类的方法中
所谓类的外部,就是在main函数中通过该类的对象访问
修饰符的权限从大到小:
    @public > @protected > @private

@public : 在所有的程序中都可以直接访问

@protected:在本类的内部可以直接访问,外部不能直接访问
在子类内部可以直接访问,外部不能直接访问

@private:
在本类的内部可以直接访问,外部不能直接访问
在子类的内部不可以直接访问,外部不能直接访问

4.访问修饰符的作用域
从定义修饰符开始 到下一个修饰符或者是大括号结束

5.使用建议
1>不能用@public
在类内部 直接访问,在类的外部,通过属性的封装访问

2>一般的自己写一个类 都是用@protected修饰,可以不写
默认的就是@protected

总结:
@public 在哪都能用
@protected 在父类和子类内部可以用
@private 只能在本类内部使用
“`

  • 私有属性和私有方法的应用
1.真私有属性
    @private修饰的属性 私有属性
    写在.m的@implementation大括号中的属性,叫做真私有属性
    私有属性和真私有属性唯一的区别,xcode不会提示


2.使用建议:
    以后写一个类,一般会有两种属性
    一种是在.h中的用@protected修饰的属性
    一种是在.m中的真私有属性

3.私有方法
    只在.m中实现,而不在.h中声明

小知识点:
    "在OC中没有真正的私有
    ```

### 多态

**多态:不同的食物,对于同一种行为,具有不同的表现形式**

需要满足的三个条件:

**1.有继承关系**

**2.有方法的重写**

**3.父类的指针指向子类的对象**

* 里氏替换原则

1.什么里氏替换原则 (缩写LSP)
“一句话:
父类的指针 可以指向子类的对象

2.里氏替换原则的好处

举例:
    人类
    属性:名字
    行为:喂狗,喂猫,喂猪(在实现中打印"xxx正在吃shi")


    狗类,猫类,猪类
    属性:姓名
在main函数中 实现人喂猪,喂狗,喂猫的过程

3.里氏替换原则的局限性
父类的指针 可以指向子类的对象
父类的指针 只能访问子类从父类继承过来的属性和方法
不能访问子类独有的成员
“`
* 方法重写

1.什么叫方法的重写?
    子类中重新实现父类继承过来的方法


2.什么时候需要方法的重写?
    a.父类继承过来的方法 子类完全不适用,重写方法
    b.父类继承过来的方法 子类需要补充,也需要方法的重写,但是重写方法的时候 要使用super关键字 [super 方法名]来先调用一下父类的方法,然后再添加自己要的一些实现


3.如何重写方法?
    "在.m文件,重新实现要重写的方法.不是改声明 也不需要再次声明



"强调
如果一个父类指针,指向了子类对象,如果通过父类的指针调用子类重写的方法
那么调用的是 子类重写后的方法
  • description方法
1.%@打印对象的原理
    使用%@ 打印对象时,内部的原理
    NSLog(@"%@",对象名);
    1>调用 [对象名 description]; 返回一个字符串

    2>把这个返回的字符串打印到控制台

2.如果想要 自定义 打印出对象的格式 那么需要重写这个description方法

3.练习:
    写一个书类,要求用%@ 打印一本书时 能打印出这本书的信息
    ```

* 继承的本质

1.子类会继承所有属性和方法

2.子类创建对象的时候,会再堆区开辟存储空间,但只会开辟属性所占的空间

3.子类调用方法时,首先会再本类中寻找,如果有则直接调用,如果没有.会向他直接父类中寻找,如果有直接调用,如果还是没有,会继续向上一级父类中寻找,如果再没有,会一直向上级父类找,指导NSObject这个类,如果这个方法还是没有,则报错

* 类是以Class对象的形式存储在代码段中的

@interface Person : NSObject
{
NSString * _name;
}
+ (void)sb;
- (void)sayHi;
@end

1.一个类在内存中以是Class对象的形式存储的
那么这个Class对象就是 代表这个类
2.如何获取存储这个类的Class对象
1>通过[对象名 class]可以获取到Class对象
2>通过[类名 class]可以获取到这个Class对象

3.Class对象 存储了类的所有信息
也就是说Class对象 就代表了这个类
比如:Class cc = [Person class];
“所以:
1.使用Class对象调用类方法 [cc sb] 就可以直接调用类方法
2.使用CLass对象 创建Person对象 [cc new]
类的本质 就是一个对象 Class类型的对象


* SEL数据

1.每一个类 都有方法 其实方法在内存中也是以一种形式存在的

一个方法在内存中 是以 SEL这种数据类型存在的

  1. //定义一个变量 来存储一个方法 sayHi
    SEL sayHiSel;//这是一个变量,这变量可以存储方法
    //@selector(方法名) 功能:根据一个方法名 返回一个SEL对象

sayHiSel = @selector(sayHi);
“`

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值