黑马程序员_OC面向对象的三大特性之封装及OC中类方法和self的使用

在这一blog中将继续运用上次的Car 类进行OC三大特性的学习,将三大特性运用到上次的例子当中。


一、封装

1.set 和get方法

set方法是能够提供一个方法,使得外部定义的类的对象能够给默认的成员变量(protected)赋值。

set 方法的命名必须以set 开头,成员变量的首字母必须是大写的,返回值是void,必须要有一个参数,参数的类型跟成员变量的参数类型是一致的。


get 方法能够返回对象内部的成员变量的值,所以get方法是有返回值的,并且返回值的类型跟成员变量的对应的类型是一致的。

成员变量的命名规范:成员变量的命名一定要用下划线 _ 开头,这样就可以使得成员变量的名称跟get方法的名称进行区分,而不用使得get 方法的参数重新命名;也可以使得成员变量的名称跟局部变量区分开来。


下面的代码是使用set 和 get 方法之后的Car的类和实现以及调用的代码:

#import <Foundation/Foundation.h>

//声明对象的属性和行为
@interface Car : NSObject
{
    //声明对象属性,成员变量默认是protected,且成员变量不能初始化,不能在外部被直接调用,不能使用static关键字进行修饰
//    @public
    int _wheels;
    int _speed;

}

//声明方法
- (void)run;
- (void)info;
//带参数的方法
- (void)setWhees:(int)wh andSpeed:(int)sp;


//wheels的set方法
- (void)setWheels:(int)wheels;
//wheels的get方法
- (int)wheels;

//speed的set方法
- (void)setSpeed:(int)speed;
//speed的get方法
- (int)speed;
@end



@implementation Car


//实现方法
- (void)run
{
    NSLog(@"车子在跑。。。。");
}

//在实现方法中可以直接调用类的成员变量
- (void)info
{
    NSLog(@"车子的轮子有%d个,车子的速度是:%d",_wheels,_speed);
}

//带参数的方法
- (void)setWhees:(int)wh  andSpeed:(int)sp
{
    _wheels = wh;
    _speed = sp;
   
}

//set方法
- (void)setWheels:(int)wheels
{
    if(wheels <= 0)
    {
       _wheels  = 1;
    }
    
    _wheels = wheels;
}
//get方法
- (int)wheels
{
    return _wheels;
}

//speed的set方法
- (void)setSpeed:(int)speed
{
    if (speed <= 0) {
        speed = 1;
    }
    
    _speed = speed;
}
//speed的get方法
-(int)speed
{
    return _speed;
}
@end


//定义一个方法
//void changeSpeed(Car *car)
//{
//    car->speed = 100;
//}



int  main()
{
  
    Car *c =  [Car new];
    
    //调用成员变量,只有成员变量是public 时,才可以调用成员变量
//    c->wheels = 4;
//    c->speed = 200;
    
    //调用方法
//    [c run];
//    [c info];
    
    //调用方法,改变对象的成员变量的值
//    changeSpeed(c);
//    [c info];
    
    //调用对象的方法,改变成员变量的值
    [c setWhees:3 andSpeed:500];
    [c info];
    
    //匿名对象
//    [Car new]->wheels =18;
//    [[Car new] run];
    
    //调用get set 方法
    [c setWheels:10];
    [c setSpeed:1000];
    [c info];
    
    NSLog(@"%d,%d",[c wheels],[c speed]);
    return 0;
}
运行结果是:


使用封装可以让我们定义在类中的成员变量选择是实现get方法还是set方法,有时候我们可能希望某个成员变量不允许被修改,而是只能被访问,所以这时候我们就可以只实现这一成员变量的get方法,而不实现set方法来实现这一效果。

二、类方法和self关键字

1.类方法是以 + 号开头的方法,只能使用类名来调用类方法,类方法中不能访问成员(实例)变量,类方法中不依赖于对象,执行效率要比对象方法高,在不访问对象成员变量的条件下,我们应尽量使用类方法来实现所需要的功能。当对象方法和类方法的名称相同时是允许的。具体的例子加入Car类中的效果如下所示:

#import <Foundation/Foundation.h>

//声明对象的属性和行为
@interface Car : NSObject
{
    //声明对象属性,成员变量默认是protected,且成员变量不能初始化,不能在外部被直接调用,不能使用static关键字进行修饰
//    @public
    int _wheels;
    int _speed;

}

//声明方法
- (void)run;
- (void)info;

//声明类方法
+ (void)info;

//带参数的方法
- (void)setWhees:(int)wh andSpeed:(int)sp;


//wheels的set方法
- (void)setWheels:(int)wheels;
//wheels的get方法
- (int)wheels;

//speed的set方法
- (void)setSpeed:(int)speed;
//speed的get方法
- (int)speed;
@end



@implementation Car


//实现方法
- (void)run
{
    NSLog(@"车子在跑。。。。");
}

//在实现方法中可以直接调用类的成员变量
- (void)info
{
    NSLog(@"车子的轮子有%d个,车子的速度是:%d",_wheels,_speed);
}

//实现类方法
+ (void)info
{
    NSLog(@"调用了类方法,我是不能访问成员变量的");

}


//带参数的方法
- (void)setWhees:(int)wh  andSpeed:(int)sp
{
    _wheels = wh;
    _speed = sp;
   
}

//set方法
- (void)setWheels:(int)wheels
{
    if(wheels <= 0)
    {
       _wheels  = 1;
    }
    
    _wheels = wheels;
}
//get方法
- (int)wheels
{
    return _wheels;
}

//speed的set方法
- (void)setSpeed:(int)speed
{
    if (speed <= 0) {
        speed = 1;
    }
    
    _speed = speed;
}
//speed的get方法
-(int)speed
{
    return _speed;
}
@end


//定义一个方法
//void changeSpeed(Car *car)
//{
//    car->speed = 100;
//}



int  main()
{
  
    Car *c =  [Car new];
    
    //调用成员变量,只有成员变量是public 时,才可以调用成员变量
//    c->wheels = 4;
//    c->speed = 200;
    
    //调用方法
//    [c run];
//    [c info];
    
    //调用方法,改变对象的成员变量的值
//    changeSpeed(c);
//    [c info];
    
    //调用对象的方法,改变成员变量的值
    [c setWhees:3 andSpeed:500];
    [c info];
    
    //匿名对象
//    [Car new]->wheels =18;
//    [[Car new] run];
    
    //调用get set 方法
    [c setWheels:10];
    [c setSpeed:1000];
    [c info];
    
    [Car info];
//    NSLog(@"%d,%d",[c wheels],[c speed]);
    return 0;
}

运行的结果是:



2. self用来指向当前的对象,所以我们可以使用"self->成员变量名" 来访问当前对象内部的成员变量,而利用[self 方法名] 可以调用其他对象方法或者是类方法:具体的例子代码如下:在Car类的对象方法setWheels中,_wheels 成员变量的访问也可以直接换成

self ->_wheels,  我们可以在setWhees:(int)  andSpeed:(int) 方法中调用setWheels 方法

@implementation Car


//实现方法
- (void)run
{
    NSLog(@"车子在跑。。。。");
}

//在实现方法中可以直接调用类的成员变量
- (void)info
{
    NSLog(@"车子的轮子有%d个,车子的速度是:%d",_wheels,_speed);
}

//实现类方法
+ (void)info
{
    NSLog(@"调用了类方法,我是不能访问成员变量的");

}


//带参数的方法
- (void)setWhees:(int)wh  andSpeed:(int)sp
{
    [self setWheels:wh];
    [self setSpeed:sp];
   
}

//set方法
- (void)setWheels:(int)wheels
{
    if(wheels <= 0)
    {
       self->_wheels  = 1;
    }
    
    self->_wheels = wheels;
}
//get方法
- (int)wheels
{
    return _wheels;
}

//speed的set方法
- (void)setSpeed:(int)speed
{
    if (speed <= 0) {
        speed = 1;
    }
    
    _speed = speed;
}
//speed的get方法
-(int)speed
{
    return _speed;
}
@end

运行结果是:



 


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值