继承与多态 类对象

来源:互联网 发布:python脚本怎么写 编辑:程序博客网 时间:2024/05/18 00:20

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);
“`

0 0
原创粉丝点击