------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
一、封装
通常程序员不希望别人对类的属性随意修改,希望隐藏数据,只有通过方法才可以对其进行访问,降低数据被无用的可能性,这时就需要用到封装
1.封装的实现步骤:
1)setter方法(外界设置成员变量值的方法)
a.方法名以set开头
b.set后面跟实例变量名,其首字母大写,并省略下划线
c.返回值为void
d.要有一个参数,类型与成员变量一致
e.形参名不能和成员变量一样
@interface Sdudent:NSObject
{
NSString *_name;
int _age;
int _score;
}
-(void)setName:(NSString *) name;
-(void)setAge:(int) age;
-(void)setScore:(int) score;
@end
setter实现
@implementation Student
-(void)setName:(NSString *) name{
_name = name;
}
-(void)setAge:(int) age{
_age = age;
}
-(void)setScore:(int) score{
_score = score;
}
@end
2)getter方法
a.一定要有返回值,并且与成员变量类型一致
b.方法名和成员变量名一样(注:无get)
c.不需要参数
d.在方法实现中,一定返回实例变量值
@interface Sdudent:NSObject
{
NSString *_name;
int _age;
int _score;
}
-(NSString*)name;
-(int)age;
-(int)score;
@end
getter实现
@implementation Sdudent
-(NSString*)name{
return _name:
}
-(int)age{
return _age;
}
-(int)score{
return _score;
}
@end
二、继承
当B类拥有A类中的所有的属性,就可称B类是子类、A类为父类,或者称B类继承了A类。NSObject类是OC中所有类的父类
@interface Dog:Animal
@end
这里Dog类继承了Animal类
1.继承的细节
1)单继承:一个类只能继承一个类,不能继承多个类
2)子类中不能再声明和父类相同的成员变量
3)方法的重写:父类中声明的方法可以在子类中进行方法重写
2.继承体系中方法调用顺序
@interface Animal : NSObject
-(void)run;
@end
@interface Dog : Animal
@end
@implementation Dog
-(void)run{
NSLog(@"狗在跑");
}
@end
这里父类中已经声明run方法,子类就不需要再声明,直接在.m文件中进行方法的重写即可
2.继承体系中方法调用顺序
1)首先在自己类中找
2)没找到再到父类中去找
3)若没找到,沿着继承关系一直在父类中找
4)都没找到则会报错
三、多态
不同的对象以自己的方式相应相同名称方法的能力称为多态
1.条件:有继承关系,并且有方法重写(如上面狗和动物的关系)
2.体现:父类指针指向子类的对象,父类对象这时可以调用子类的方法
Animal *a = [Dog new];
[a run];
打印结果是“狗在跑”,说明这里父类对象a调用的是子类方法的run
3.父类若想访问子类特有属性或者调用子类特有方法需要进行强制类型转换
四、@property
1.@property是编译器指令,用于@interface中,作用是自动生成setter和getter的声明@property int age;
-(int)age;
-(void)setAge:(int)age;
第一行代码就可以代替后两行代码
2.@synthesize用于@implementation中,用于自动实现setter和getter方法(注意:这里会访问成员变量_age,若不存在则会自动生成一个成员变量_age
@synthesize age = _age;
-(int)age{
return _age;
}
-(void)setAge:(int)age{
_age = age;
}
第一行代码可以替换后面setter和getter方法的实现
3.@property增强
自从Xcode 4.0之后,@property就同时拥有了setter和getter的声明和实现
五、id类型
通用对象类型,可存储任何类的对象,相当于NSObject*,若调用一个不存在的方法编译器会马上报错
id d =[Dog new];
[d run];
六、实例变量修饰符
1.@public:它所修饰的实例变量可以在任意程序集访问
2.@protected:可以在当前类或者子类中任意访问
3.@private:只能在当前类中访问
4.@package:在同一个框架下可以访问,介于@private和@public之间,用的比较少