4-封装/继承/多态

People Lack Willpower,Rather Than Strength!

1.封装

  • 概念:封装性就是隐藏实现细节,仅对外公开接口。

    • 技术概念:是指隐藏对象的属性和实现的细节,仅对外提供公共的访问方法
  • 好处:

    • 将变化隔离;
    • 提高安全性;
  • 原则:

    • 将不需要对外提供的内容都隐藏起来,把属性都隐藏,提供公共的方法对其访问.
  • setter/getter

    • setter作用:用来设置成员变量,可以在方法里面过滤掉一些不合理的值.
    • getter作用:为调用者返回对象内部的成员变量的值.
    • 体现了封装思想.
  • 点语法:

    • 注意:
      • 点语法的本质是方法的调用,而不是访问成员变量.** 如果没有set和get方法,则不能使用点语法**。
      • 不在要在getter 与 setter方法中使用本属性的点语法.

2.self关键字

+ 成员变量:成员变量是一个实例对象的具体状态特征,并且这些状态特征是可以改变的;
+ 对象方法:一个实例对象的行为,有可能会影响自身的某些状态特征.
    > 对象方法可以通过 [[self class] +method]调用类方法
    > 因为,既然有对象,那么肯定存在类,反之不然.
+ 类方法:类方法是某个类的行为,可以直接通过类名调用;如果在类方法中需要使用某些数据,必须通过参数传入;
    > 它不能绕过对象直接访问成员变量。
    > 因为有类并不一定有对象! 

+ 类方法中的self
    - self 就是类对象(类对象的指针).
    - 通过类名调用类方法,其实就是给类对象发消息.
    - 整个程序运行过程中,一个类只能有一个类对象.
+ 对象方法中的self:
    - 在整个程序运行过程中,一个类可以有0个或多个对象.
  • 全局变量成员变量局部变量:

    • 从作用域的范围来看:全局变量 > 成员变量 > 局部变量
    • 不同的作用域中的同名的变量:局部变量覆盖成员变量,成员变量覆盖全局变量.

      对象方法中出现与成员变量同名的局部变量,如果想使用该成员变量可以通过self.成员变量名的方式

  • self使用注意:

    • self只能在方法中用,一般只能调方法(最多可以访问public的属性),不能用来调函数.
    • 一个方法内部self调用自己,会死循环.
  • super和self比较:

self super
隐私参数 编译器指示符
它和super指向的是相同的消息接收者 只是告诉编译器在执行的时候,去调谁的方法
``` 
*self*: refers to the object receiving a message in objective-C programming.
*super*: is a flag that tells the compiler to search for the method implementation in a very different place. e. It begins in the superclass of the class that defines the method where super appears.It begins in the superclass of the class that defines the method where super appears.

``` 

3.继承:

  • 注意:

    • 继承不是复制一份,而是获得使用权!!!
    • OC中是单继承的关系
    • 子类和父类的关系也称为:(是一个)的关系(dog isa animal).
    • 基类的私有属性能被继承,但子类不能访问.
  • 继承中方法调用的顺序:

    • 在自己类中找-->父类中找-->就去父类的父类-->直到找到基类(NSObject)-->如果NSObject都没有就报错了
  • 继承的注意事项:

    • 子类不能定义和父类同名的成员变量,私有成员变量也不可以(可见私有变量也被继承了).

4.多态

  • 多态条件:
    1. 有继承关系
    2. 子类重写父类方法
    3. 父类指针指向子类对象

    -> 为什么一定要重写?
    : 如果没有重写,看下面的情况:
    
    Person *p = [Student new];
    [p study]
    
    > 注意:这里Student有study方法.
    > 如果我们想用p调用study,如果study方法是Student独有的方法,compile time父类指针无法响应子类方法的SEL值(NO ==[p repondsToSelector:@(method)])

  • 多态优点:

    • 简化了编程接口.它允许在类和类之间重用一些习惯性的命名,而不用为每一个新加的函数命名一个新名字。编程接口就是一些抽象的行为的集合,从而 和 实现接口的类的区分开来。
    • 代码扩展性和复用性更好一些.多态也使得代码可以分散在不同的对象中而不用试图在一个函数中考虑到所有可能的对象。

    应用: 当一个新的情景出现时,您无须对现有的代码进行改动,而只需要增加一个新的类和新的同名方法。

    • 从宏观上看:一个父类指针作为参数时,可以传入多个子类对象.节省代码.
    • 从微观上看:当某个方法出现新的形态时,如果想在不修改原方法特性的基础上增加新特性,那么就需要创建一个派生类,派生类中重写原方法.
  • 多态能实现的支撑----OC语法特性:动态绑定

    • 动态绑定:程序直到runtime才确定要对哪个对象发送消息去找对应SEL的方法.

      OC不同于传统程序设计语言,它可以在runtime加入新的数据类型和新的程序模块:动态类型识别,动态绑定,动态加载

5.实例变量修饰符:

1.修饰符的意义

@public @protected @private @package
(公开的) (受保护的) (私有的) (框架级别的)
在有对象的前􏰀下,任何地方都可以直接访问。 只能在当前类和子类的对象方法中访问 只能在当前类的对象方法中才能直接访问 作用域介于私有和公开之间,只要处于同一个框架中相当于@public,在框架外部相当于@private

2.变量修饰符在子类中的访问:

  • 1)@private私有成员是能被继承,不能直接访问,也不能被外部方法访问。
  • 2)@public 公有成员能被继承,能直接方法,也能被外部方法访问。
  • 3)@protected 保护成员能够被继承,能被子类直接访问,不能够被外部方法访问
  • 注意:
    • 1.@interface @end之间声明的成员变量,默认是protected
    • 2.@property生成的变量,默认是@private

6.description陷阱

  • 不要在description方法中同时使用%@和self
(NSString *)description {
   return [NSString stringWithFormat:@"%@", self];
}
  • 同时使用了%@和self,代表要调用self的description方法,因此最终会导致程序陷入死循环,循环调用description方法;
    • 当[NSString stringWithFormat:@“%@”, self]; 使用它时,循坏调用,导致系统会发生运行时错误。
    • 当该方法使用NSLog(“%@”,self) 时候, 系统做了相关的优化,循坏调用3次后就会自动退出
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,440评论 5 467
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,814评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,427评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,710评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,625评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,014评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,511评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,162评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,311评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,262评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,278评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,989评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,583评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,664评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,904评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,274评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,856评论 2 339

推荐阅读更多精彩内容

  • 1.面向对象三大特性 -封装性 -继承性 -多态性 2.什么是封装 封装性就是隐藏实现细节,仅对外公开接口。 3....
    梦夜繁星阅读 1,076评论 0 6
  • 一、继承 当两个事物之间存在一定的所属关系,即就像孩子从父母那里得到遗传基因一样,当然,java要遗传的更完美,这...
    玉圣阅读 1,043评论 0 2
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,531评论 18 399
  • 继承和多态 1. 继承的优缺点 优点:(1)子类可以灵活地改变父类中的已有方法;(2)能够最大限度的实现代码重用。...
    MinoyJet阅读 618评论 0 0
  • 一:java概述:1,JDK:Java Development Kit,java的开发和运行环境,java的开发工...
    ZaneInTheSun阅读 2,620评论 0 11