黑马程序员——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方法
二、类方法
类名调用的方法,就是类方法;类方法都是以+加号开头的,对象方法都是以-减号开头的。
任何类在使用前都会被加载金内存,内存中存储的就是该类的方法列表。类方法性能优秀,因为不用创建对象,就可以调用类方法执行一些动作。
类方法和对象方法可以同名,但不建议这样做。
类方法和对象方法的总结
对象方法:
> 减号 - 开头
> 只能由对象来调用
> 对象方法只能访问当前对象的成员变量
类方法:
> 加号 + 开头
> 只能由类名来调用
> 类方法不能访问成员变量,类的存储空间只有方法列表。
类方法的好处和使用场合
> 不依赖于对象,执行效率高。(不用新建对象,就能执行该方法)(
> 开发中能用类方法尽量用类方法
> 场合:当方法内部不需要使用成员变量时就可以改为类方法。
三、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,就是调用父类的对象方法。
五、多态
> 多种形态,多态的前提是继承、方法重写。
> 父类指针指向子类对象
> 多态的好处:如果函数\方法参数中使用的是父类的类型,可以传入父类、子类的对象。
> 局限性:父类类型的变量,不能直接调用子类特有的方法(子类有的,父类没有的方法)
> 如果实在是想要调用子类特有的方法,就要用到强制转换,把父类指针强制转换成子类指针(类型 *)
面向对象的三大特性:封装、继承和多态。
一、封装
封装,把成员变量和方法封装起来,让外界不必关注内部的细节。
封装的好处:
> 过滤不合理的值
> 屏蔽内部过程
> 让外界不必关注内部细节
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,就是调用父类的对象方法。
五、多态
> 多种形态,多态的前提是继承、方法重写。
> 父类指针指向子类对象
> 多态的好处:如果函数\方法参数中使用的是父类的类型,可以传入父类、子类的对象。
> 局限性:父类类型的变量,不能直接调用子类特有的方法(子类有的,父类没有的方法)
> 如果实在是想要调用子类特有的方法,就要用到强制转换,把父类指针强制转换成子类指针(类型 *)
相关文章推荐
- 面试爱奇艺
- iOS面试题
- 面试题(多线程)
- 2016届360公司PHP服务端开发笔试和面试之所得所感
- translation-interview
- 每个程序员都应该学会分解复杂的方法
- 程序员如何保持冷静地工作
- 记一道关于链表的面试题
- 黑马程序员——Java基本语法
- iOS面试 OC
- 黑马程序员——Java基础---IO---Filel类
- 黑马程序员——java基础--集合
- 黑马程序员——Java中的异常处理
- 老菜鸟致青春,程序员应该选择java 还是 c#-
- 黑马程序员——高新技术--泛型
- 手把手教程序员如何追到女神(附详细教程)
- 程序员也需要知道的经济学通识
- 程序员的诞生
- 史上最全的iOS面试题及答案
- 30来岁程序员的一些想法