您的位置:首页 > 职场人生

黑马程序员——OC学习笔记03 面向对象2 面向对象的三大特性

2015-10-17 10:07 393 查看
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

面向对象的三大特性:封装、继承和多态。

一、封装

封装,把成员变量和方法封装起来,让外界不必关注内部的细节。

封装的好处:

> 过滤不合理的值

> 屏蔽内部过程

> 让外界不必关注内部细节

1、为了不让用户随便的直接访问成员变量,但还可以修改成员变量的值,并且有时候要对用户修改的值进行过滤。

这时候就用到了set方法:

set方法,把设置成员变量的值的方式封装到一个方法中。

作用:

> 提供一个方法给外界设置成员变量的值。

> 可以在方法里面对参数进行过滤。

命名规范:

> 方法名必须以set开头

> set后面跟上成员变量的名称,成员变量的首字母必须大写

> 返回值一定是(void)

> 一定要接受一个参数,而且参数的数据类型和成员变量的类型一致。

> 形参的名称不能和成员变量的一样。

2、同set方法类似,也有一个访问成员变量的方法get方法

get方法:

作用:

> 返回对象内部的成员变量

命名规范:

> 必须有返回值,返回值类型必须与成员变量一致

> 方法名根成员变量名一样

> 不需要接受任何参数

3、成员变量的命名规范:一定要以下划线开头

作用:

> 让成员变量和get方法的名称区分开

> 可以根局部变量分开,一看到下划线开头的变量,一般都是成员变量。

示例:Person类两个成员变量的set和get方法

</pre><pre name="code" class="objc"><span style="font-family: Arial, Helvetica, sans-serif;">#import <Foundation/Foundation.h></span>
//声明
@interface Person : NSObject
{
NSString *_name;
int _age;
}

- (void)setName:(NSString *)name;
- (NSString *)name;

- (void)setAge:(int)age;
- (int)age;

@end
//实现
#import "Person.h"

@implementation Person
- (void)setName:(NSString *)name
{
_name = name;
}
- (NSString *)name
{
return _name;
}

- (void)setAge:(int)age
{
_age = age;
}
- (int)age
{
return _age;
}

@end


二、类方法
类名调用的方法,就是类方法;类方法都是以+加号开头的,对象方法都是以-减号开头的。

任何类在使用前都会被加载金内存,内存中存储的就是该类的方法列表。类方法性能优秀,因为不用创建对象,就可以调用类方法执行一些动作。

类方法和对象方法可以同名,但不建议这样做。

类方法和对象方法的总结

对象方法:

> 减号 - 开头

> 只能由对象来调用

> 对象方法只能访问当前对象的成员变量

类方法:

> 加号 + 开头

> 只能由类名来调用

> 类方法不能访问成员变量,类的存储空间只有方法列表。

类方法的好处和使用场合

> 不依赖于对象,执行效率高。(不用新建对象,就能执行该方法)(

> 开发中能用类方法尽量用类方法

> 场合:当方法内部不需要使用成员变量时就可以改为类方法。

三、self关键字

self关键字根对象和类相关,self是一个指针,self指向方法的调用者。

用途:

概念:指向了当前对象或类(方法调用者),谁调用它他就指向谁。在对象方法里调用,它就指向当前对象,在类方法中调用,他就指向当前类。

用途1:可以利用self -> 成员变量 访问当前对象内部的成员变量

用途2:[self 方法名] 调用类方法或者对象方法。

四、继承

创建一个新的类时,通常需要根据它与现有的类的区别来定义。使用继承可以定义一个具有父类所有功能和属性的新类,即它继承了父类的功能和属性。

即加入B类继承了A类,就相当于B类拥有了A类中所有的成员变量和方法

继承的好处:

> 抽取了重复的代码

> 建立了类之间的关系

> 子类可以拥有父类中的所有成员变量和方法

NSObject是一个root类,也就是根类,OC中几乎所有的对象都是它的子类。

还有一个根类,NSProxy。

继承的书写格式:

大多数定义类的时候类名后面都有”冒号 + NSObject",这个就是就是继承

格式:@interface 子类名 : 父类名

继承的使用注意:

> 多个类在同一个文件的时候,父类的声明要放在子类的前面。

> OC里面不允许子类和父类拥有相同的名称和成员变量,编译时就会报错。

> 子类中允许拥有和父类同名的方法(重写:子类重新实现父类的某个方法,覆盖掉父类的方法)

> 父类里可以只声明方法,不实现方法,留给子类去实现

> 调用某个对象的某个方法时,最先找自己的类,如果找不到,就去父类找,父类找不到,在往上找,知道找到NSObject类。

> 每个类都有一个superclass指针指向父类。

> NSObject只有一个成员变量isa,所以它所有的子类也都有isa成员变量。

继承的缺点:耦合性太强(耦合性:类之间的依赖关系)。

继承也不能乱用,得符合现实的逻辑关系。比如一个成绩类,有语文和数学两个成员变量。然后有定义一个学生类,它不光有身高年龄体重还有数学和语文成绩,这时候如果用学生类继承成绩类,这是不符合现实逻辑关系的。这时候就要用到另一个概念,组合(复合)。

组合(复合)一个类里面有另一个类属性的成员变量,不如学生类里有一个成绩类类型的成员变量。

super 关键字,[super  方法名]  调用父类的对象方法或类方法,super调用父类的类方法还是对象方法和self一样,取决于使用环境,在类方法中使用super,就是调用父类的类方法,在对象方法中使用super,就是调用父类的对象方法。

五、多态

> 多种形态,多态的前提是继承、方法重写。

> 父类指针指向子类对象

> 多态的好处:如果函数\方法参数中使用的是父类的类型,可以传入父类、子类的对象。

> 局限性:父类类型的变量,不能直接调用子类特有的方法(子类有的,父类没有的方法)

> 如果实在是想要调用子类特有的方法,就要用到强制转换,把父类指针强制转换成子类指针(类型 *)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: