—Java培训、Android培训、iOS培训、.Net培训、期待与您交流—
一、封装
1.封装的定义
隐藏对象的属性和方法的实现细节,对外只公开接口用来调用
2.set方法和get方法
<1>set方法
a.作用:提供一个方法给外界设置成员变量值,可以在方法里面对参数进行相应过滤,以保证数据的安全性
b.命名规范:
1>.方法名必须以Set开头
2>.Set后面跟上成员变量的名称,成员变量的首字母必须大写
3>.返回值一定是void
4>.一定要接收一个参数,而且参数类型跟成员变量类型一致
5>.形参的名称不能跟成员变量名一样
<2>get方法
a.作用:返回对象的成员变量
b.命名规范
1>.肯定有返回值,返回值类型肯定与成员变量类型一致
2>.方法名跟成员变量名一样
3>.不需要接收任何参数
3.成员变量的命名规范
一定要以下划线—开头
作用:
1>.让成员变量名和get方法的名称区分开
2>.可以跟局部变量区分开,一看到下划线开头的变量,一般都是成员变量
示例:set和get方法的声明
#import <Foundation/Foundation.h>
@interface Student : NSobject
{
int _age;
}
- (void)setAge:(int)age; //成员变量_age的set方法声明
- (int)age; //成员变量_age的get方法声明
- (void)study; //study的方法声明
@end
示例:set和get方法的实现
@implementation Student
//set方法的实现
- (void)setAge: (int)age
{
//对传进来的参数进行过滤
if(age <= 0)
{
age = 1;
}
_age = age;
}
- (int)age
{
return _age;
}
_ (void)study
{
NSLog(@"%d岁的学生在学习",_age);
}
@end
int main()
{
Student *stu = [Student new];
[stu setAge:10];//也可以写成 stu->age = 10;或者self->age = 10;
[stu study];
return 0;
}
4.类方法和对象方法
a.对象方法
1> 减号 -开头
2> 只能由对象来调用
3> 对象方法中能访问当前对象的成员变量(实例变量)
b.类方法
1> 加号 +开头
2> 只能由类(名)来调用
3> 类方法中不能访问成员变量(实例变量)
c.类方法的好处和使用场合
1>.不依赖于对象,执行效率高
2>.能用类方法,尽量用类方法
3>.可以允许类方法和对象方法同名
4>.场合:当方法内部不需要使用到成员变量时,就可以改为类方法
5.self的用途:
1>.谁调用了当前方法,self就代表谁
self出现在对象方法中,self就代表对象
self出现在类方法中,self就代表类
2> 在对象方法利用”self->成员变量名”访问当前对象内部的成员变量
3> [self 方法名]可以调用其他对象方法\类方法
6.super的作用
1.直接调用父类中的某个方法
2.super处在对象方法中,那么就会调用父类的对象方法
super处在类方法中,那么就会调用父类的类方法
3.使用场合:子类重写父类的方法时想保留父类的一些行为
4.格式:[super 方法名]
二、继承
1.继承的好处:
1>.抽取重复代码
2>.建立了类之间的关系
3>.子类可以拥有父类中的所有成员变量和方法
2.继承的注意点:
1>.基本上所有类的根基是NSObject
2>.父类必须声明在子类的前面
3>.子类不能拥有和父类相同的成员变量
4>.调用某个对象方法时,优先去当前对象中找,如果找不到,去父类中找。
5>.重写是子类重新实现父类中的方法,覆盖父类以前的做法
3.继承的使用场合
1>.当两个类拥有相同属性和方法的时候,就可以将相同的东西抽取到一个父类中
2>.当A类完全拥有B类的部分属性和方法时,可以让B类继承A类
4.继承和组合
继承:XX是XXX
组合:XXX拥有XX
示例:仅仅只是做个简单介绍
//下面分别是学生类的声明和分数类的声明,它们是同等级的,都继承NSObject这个根类
@interface Student : NSObject
@interface Score : NSObject
Score *_score;//代表学生类里面也拥有这个分数
三、多态
1、多态的基本认识
1>.某一类事物的多种形态
2>.OC对象具有多态性
2、多态的体现
1>.子类对象赋值给父类指针
2>.父类指针访问对应的属性和方法
示例:
#import <Foundation/Foundation.h>
@interface Animal : NSObject
- (void)eat;
@end
@implementation Animal
- (void)eat
{
NSLog(@"Animal-吃东西---");
}
@end
@interface Dog : Animal
@end
@implementation Dog
- (void)eat
{
NSLog(@"Dog-吃东西---");
}
@end
int main()
{
//多态:父类指针指向子类对象
Animal *a = [Dog new];
[a eat]; //当调用一个方法时,是动态检测这个方法有没有被实现,其实它的真实类型不是Animal,而是Dog,所以最终输出的结果是Dog-吃东西
return 0;
}
3.多态的注意点
1>.父亲类型的变量不能用来调用子类的方法,必须强转为子类类型变量后,才能直接调用父类特有的方法。
例如:
Animal *a = [Dog new];//在这里Animal是Dog的父类
Dog *d = (Dog *)a;//强制转换跟int a = (int)1.05;道理一样
[d run];
2>.没有继承就没有多态
3>.代码的体现是父类类型的指针指向子类对象,例如:Animal *a = [Dog new];
4>.如果函数或者方法参数中使用的是父亲类型,可以传入父类、子类对象