-----------android培训、java培训、java学习型技术博客、期待与您交流!------------
1. 封装
Set方法
1作用.提供一个方法给外界设置成员变量
Set后面跟上成员变量的名称,成员变量的首字母大写
返回值一定是void
一定要接收一个参数,而且参数类型跟成员变量类型一致
形参的名称不能跟成员变量一样当A类包含了B类的成员变量或者类方法时,我们可以让A类继承B类,A类为B类的子类,B类为A类的父类,而NSObject是所有类的父类。继承可以有效减少代码冗余,更好地建立类与类之间的关系,子类拥有父类所有的成员变量和方法。当然这样也容易因为耦合性太高,牵一发而动全身
方法名必须以set开头
#import <Foundation/ Foundation .h>
@interface Student : NSObject
{
@public
int age;
int no;
}
- (void)setAge:(int)newAge;
- (void)study;
@end
@implementation Student
- (void)setAge:(int)newAge;
- {
if (newAge <= 0)
{
newAge = 1;
}
Age = newAge;
}
Get方法
1返回对象内部成员变量
肯定有返回值,返回值类型肯定与成员变量一致
方法名与成员变量一样
不需要接收任何参数
调用eat方法时,使用的是Dog类的eat方法,而不是Animal的eat方法。需要注意,没有继承关系,不能使用多态,同时,子类的指针不能指向父类的对象。
多态的好处是可以更好地调用函数,无需多次定义类似的函数与相应的类进行匹配。但是父类类型的变量不能直接调用子类特有的方法。必须强转为子类类型变量后,才能直接调用子类特有的方法。
-(int)age
{
Return age;
}
- (void)study
{
NSLog(@”%d个学生在学习”,age);
}
@end
Int main( )
{
Student *stu = [Student new];
[stu setAge:10];
NSLog(@”学生的年龄是@d岁”,[stu age]);
Return 0;
}
需要注意的是,类的成员变量不能轻易被外界调用修改,通常使用setter方法与getter方法赋值和获取,但是成员变量要与getter和setter方法参数区分,所以成员变量以_下划线开头。另外,OC是弱语法,在只写实现不写声明的情况下,方法依然可以运行,但并不推荐。
封装
成员变量的命名一定要以下划线开头
作用:让成员变量和get方法的名称区分开
可以跟局部变量分开,下划线开头的变量一般都是成员变量
#import <Foundation/ Foundation .h>
typedef enum{
SexMan,
SexWoman
}Sex;
@interface Student : NSObject
{
Int no;
Sex sex;
}
Sex的set和get方法
- (void)setSex:(Sex)Sex;
- (Sex)sex;
No的set和get方法
- (void)setNo(int)no;
{
_no = no;
}
- (int)no;
{
return _no;
}
@end
int main( )
{
Student *stu = [Student new];
[stu setSex:SexMan];
[stu setNo:10];
[stu sex];
[stu no];
return 0;
}
@implementation Student
- (void)setSex:(Sex)newSex;
{
_Sex = newSex;
}
-(Sex)sex
{
Return _sex;
}
@end
弱语法、
一旦运行过程中出错就会闪退
Oc是在运行过程中才会检测到对象有没有事项相对应的方法#import <Foundation/ Foundation .h>
@interface Student : NSObject
- (void)test;
@end
@implementation person
@ent
Int main()
{
Person *p = [person new];
[p test];
return 0;
}
类方法
类方法都是以加号开头,只能由类名来调用
类方法中不能访问成员变量
类方法使用场合和好处
不依赖于对象,执行效率高
能用类方法尽量用类方法
当方法内部不需要使用到成员变量时就可以改为类方法
可以允许类方法和对象方法同名
#import <Foundation/ Foundation .h>
@interface person : NSObject
{
int age;
}
+ (void)printClassName;
- (void)test;
+(void)test;
@end
@implementation person
+ (void)printClassName;
{
NSLog(@”这个叫person-%d”,age);
}
-(void)test
{
NSLog(@”111-%d,age”);
[person test]
}
+ (void)test;
{
NSLog(@”222”)
}
@end
int main()
{
//[person printClassName];
Person *p = [person new];
[p printClassName];
[p test];
Return 0;
}
继承的基本使用
当A类包含了B类的成员变量或者类方法时,我们可以让A类继承B类,A类为B类的子类,B类为A类的父类,而NSObject是所有类的父类。继承可以有效减少代码冗余,更好地建立类与类之间的关系,子类拥有父类所有的成员变量和方法。当然这样也容易因为耦合性太高,牵一发而动全身
抽取重复代码
建立了类之间的关系
子类可以拥有父类中的所有成员变量和方法
#import <Foundation/ Foundation .h>
@interface Dog : NSLobject
{
int _age;
double _weight;
}
- (void)setAge:(int)age;
- (int)age;
- (void)setWeight:(double)weight;
- (double)weight;
@end
@implementation Animal
- (void)setAge:(int)age
{
_age = age;
}
- (int)age
{
retirn _age;
}
- (void)setWeight(double)weight
{
_weight = weight;
}
- (double)weight
{
Return _weight;
}
@end
@intplface Dog : Animal
@end
@implementation Dog
@end
@interface Cat : Animal
@end
@implementation Cat
@end
Int main()
{
Dog *d = [Dog new];
[d setAge:10];
NSLog(@”age=%d”,[d age]);
Return 0;
}
多态
没有继承就没有多态
代码的体现:父类类型的指针指向子类对象
好处:如果函数方法参数中使用的是父类类型,可以传入父类子类对象
局限性:父类类型的变量不能直接调用子类特有的方法
#import <Foundation/ Foundation .h>
@interface Animal : NSLobject
- (void)eat;
@end
@implementation Animal
- (void)eat
{
NSLog(@”Animal-吃”);
}
@end
@interface Dog : Animal
-(void)run;
@end
@implementation Dog
-(void)run;
{
NSLog(@”Dog-跑”);
}
-(void)eat;
{
NSLog(@”Dog-吃”);
}
@end
@interface Cat : Animal
@ent
@implementation Cat
-(void)eat;
{
NSLog(@”Cat-吃”);
}
@end
Void feed(Animal *a)
{
[a eat];
}
int main()
{
Dog*d = [Cat new];
[d eat];
}