黑马程序员-OC语言之三大特性
2014-12-19 09:48
134 查看
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流!
-------
一、封装
首先说封装的好处,如果把类的成员变量前加@public,这样数据会不安全(即数据没有被封装),因为此时外界可以随意的调用成员变量,去改变值、访问值(即暴露)。面向对象的思想是对象内部结构不要暴露给外界。所以使用封装更加安全。
1、set方法
*给外界提供一个方法,用来对成员变量赋值
*set方法中可以对参数进行相应的的过滤
命名规范:
1>方法必须以set开头
2>set后面跟上成员变量的名称,成员变量的首字母必须大写
3>返回值一定是void
4>一定要接收一个参数,而且参数类型跟成员变量类型一致
5>形参名不能跟成员变量名一样
2、get方法
*返回对象内部的成员变量
命名规范:
1>肯定有返回值,返回值类型与成员变量一致
2>方法名跟成员变量名一致
3>不需要接收任何参数
/*报错收集
error:-[Person test]:unrecognized selector sent to instance 0x7fd2ea4097c0
意为给地址为0x7fd2ea4097c0的Person对象发送了一个不能识别的消息:test为对象方法。因为OC使用了消息机制,所以调用对象的方法即是给对象发送消息。OC在运行过程中才会检测对象有没有实现相应的方法。
*/
类方法:
1>加号 + 开头
2>只能由类(名)来调用
3>类方法中不能访问成员变量(实例变量)
类方法的好处:
1>不依赖于对象,执行效率高
2>能用类方法,尽量用类方法
3>当方法内部不需要使用到成员变量时,就可以改为类方法
4>类方法名可以与对象方法同名
self的用法:
1、在对象方法里调用成员变量“self->_age”
2、调用当前对象方法或类方法“[self method]”
类和对象在内存中的变现形式:
注:类在使用之前会加载到内存中,并且把所有的方法(对象方法和类方法)放入方法列表中,而成员变量(实例变量)只有当创建对象(创建实例)的时候才会存在内存中。
二、继承
继承的好处:
1、抽取重复代码
2、建立了类之间的关系
3、子类可以拥有父类中所有成员变量和方法
缺点:耦合性太强
继承注意:
1、父类至少要声明在子类前面
2、不允许子类和父类拥有相同名称的成员变量
3、调用某个对象的方法时,优先去当前对象中找。如果找不到,去父类中找。如果子类和父类中有相同名字的对象方法或相同名字的类方法,则为重写。
重写:子类重新实现父类中的某个方法,覆盖父类以前的做法。
继承的内存示意图:
继承使用场合:
1、当两个雷拥有相同的属性和方法时,可以将相同的东西抽取到一个父类中
2、当A类完全拥有B类中的部分属性和方法时,可以考虑让B类继承A
有时候一个类完全拥有另一个类的部分属性和方法,但是两个并无太大关系,所以应该考虑使用组合,而不是一味的使用继承,如下:
关键字:super
作用:
1、直接调用父类中的某个方法
2、super处在对象方法中,调用父类的对象方法
super处在类方法中,调用父类的类方法(取决于当前环境)
3、使用场合:子类重写父类的方法时想保留父类的一些行为
三、多态
父类指针指向子类对象
调用方法时会检测对象的真实形态
多态的好处:如果函数\方法参数中使用的是父类类型,可以传入父类、子类对象
多态的局限性:父类类型的变量不能用来调用子类特有的方法,如果要调用,那么就将父类对象强制转换成子类对象,例如“(Dog *)animal”。
-------
一、封装
首先说封装的好处,如果把类的成员变量前加@public,这样数据会不安全(即数据没有被封装),因为此时外界可以随意的调用成员变量,去改变值、访问值(即暴露)。面向对象的思想是对象内部结构不要暴露给外界。所以使用封装更加安全。
1、set方法
*给外界提供一个方法,用来对成员变量赋值
*set方法中可以对参数进行相应的的过滤
命名规范:
1>方法必须以set开头
2>set后面跟上成员变量的名称,成员变量的首字母必须大写
3>返回值一定是void
4>一定要接收一个参数,而且参数类型跟成员变量类型一致
5>形参名不能跟成员变量名一样
@interface Student : NSObject { //成员变量的命名规范:以下划线开头 //成员变量尽量不用@public int _age; } - (void)setAge:(int)age; @end @implementation - (void)setAge:(int)newAge { //对传来的参数进行过滤 if(newAge<=10) { newAge = 1; } _age = newAge; } @end int main() { Student *stu = [Student new]; [stu setAge:10]; reutrn 0; }
2、get方法
*返回对象内部的成员变量
命名规范:
1>肯定有返回值,返回值类型与成员变量一致
2>方法名跟成员变量名一致
3>不需要接收任何参数
@interface Student : NSObject { //成员变量的命名规范:以下划线开头 //成员变量尽量不用@public int _age; } - (int)age; @end @implementation - (int)age { return _age; } @end int main() { Student *stu = [Student new]; //获取成员变量age,默认为0 int a = [stu age]; reutrn 0; }
/*报错收集
error:-[Person test]:unrecognized selector sent to instance 0x7fd2ea4097c0
意为给地址为0x7fd2ea4097c0的Person对象发送了一个不能识别的消息:test为对象方法。因为OC使用了消息机制,所以调用对象的方法即是给对象发送消息。OC在运行过程中才会检测对象有没有实现相应的方法。
*/
类方法:
1>加号 + 开头
2>只能由类(名)来调用
3>类方法中不能访问成员变量(实例变量)
类方法的好处:
1>不依赖于对象,执行效率高
2>能用类方法,尽量用类方法
3>当方法内部不需要使用到成员变量时,就可以改为类方法
4>类方法名可以与对象方法同名
self的用法:
1、在对象方法里调用成员变量“self->_age”
2、调用当前对象方法或类方法“[self method]”
类和对象在内存中的变现形式:
注:类在使用之前会加载到内存中,并且把所有的方法(对象方法和类方法)放入方法列表中,而成员变量(实例变量)只有当创建对象(创建实例)的时候才会存在内存中。
二、继承
//Pserson继承了NSObject根类 @interface Person : NSObject char * _name; int _age; - (void)method1; + (void)method2; @end @implementation ... @end //Tom继承Person,拥有Person中的所有成员变量和所有方法,Person称为父类,Tom称为子类 @interface Tom : Person @end @implementation @end
继承的好处:
1、抽取重复代码
2、建立了类之间的关系
3、子类可以拥有父类中所有成员变量和方法
缺点:耦合性太强
继承注意:
1、父类至少要声明在子类前面
2、不允许子类和父类拥有相同名称的成员变量
3、调用某个对象的方法时,优先去当前对象中找。如果找不到,去父类中找。如果子类和父类中有相同名字的对象方法或相同名字的类方法,则为重写。
重写:子类重新实现父类中的某个方法,覆盖父类以前的做法。
继承的内存示意图:
继承使用场合:
1、当两个雷拥有相同的属性和方法时,可以将相同的东西抽取到一个父类中
2、当A类完全拥有B类中的部分属性和方法时,可以考虑让B类继承A
有时候一个类完全拥有另一个类的部分属性和方法,但是两个并无太大关系,所以应该考虑使用组合,而不是一味的使用继承,如下:
@interface Score : NSObject { <span style="white-space:pre"> </span>int _cScore; int _ocScore; } @end @implementation Score @end // 继承:xx是xxx // 组合:xxx拥有xxx @interface Student : NSObject { // 组合 Score *_score; // int _cScore; // int _ocScore; int _age; } @end
关键字:super
作用:
1、直接调用父类中的某个方法
2、super处在对象方法中,调用父类的对象方法
super处在类方法中,调用父类的类方法(取决于当前环境)
3、使用场合:子类重写父类的方法时想保留父类的一些行为
三、多态
父类指针指向子类对象
调用方法时会检测对象的真实形态
@interface Animal : NSObject - (void)method; @end @implementation - (void)method { NSLog(@”Animal’s method”); } @end @interface Dog : Animal @end @implementation - (void)method { NSLog(@”Dog’s method”); } @end int main() { //父类指针指向子类对象 Animal *a = [Dog new]; //访问的是Dog的method方法,动态绑定 [a method]; return 0; }
多态的好处:如果函数\方法参数中使用的是父类类型,可以传入父类、子类对象
多态的局限性:父类类型的变量不能用来调用子类特有的方法,如果要调用,那么就将父类对象强制转换成子类对象,例如“(Dog *)animal”。
相关文章推荐
- 黑马程序员——OC语言基础:面向对象三大特性,封装、继承、多态
- 黑马程序员—OC语言基础—面向对象的三大特性(1)
- 黑马程序员——OC语言基础篇---面向对象之三大特性
- 黑马程序员——OC语言基础——面向对象三大特性之继承
- 黑马程序员—OC语言基础—面向对象的三大特性(2)
- 黑马程序员_OC语言之面向对象的三大特性(封装、继承、多态)
- 黑马程序员——OC语言基础——面向对象三大特性之封装
- 黑马程序员——OC语言基础——面向对象三大特性之多态
- 黑马程序员——OC语言学习——OC面向对象的三大特性:封装、继承、多态,OC字符串——NSString
- [黑马程序员]13[OC语言]OC三大特性部分学习笔记总结
- 黑马程序员—OC语言面向对象三大特性
- 黑马程序员——OC语言三大特性
- 黑马程序员(OC的三大特性)
- 黑马程序员——OC基础——类的三大特性(2)
- 黑马程序员-OC之面向对象的三大特性:封装、继承和多态
- 黑马程序员—OC之三大特性
- 黑马程序员——OC基础三大特性
- oc语言--面向对象的三大特性
- 黑马程序员————OC面向对象_三大特性之继承与多态
- OC语言-02面向对象的三大特性