OC学习(二)--之实例变量可见度和方法

一. 实例变量可见度

    实例变量可见度对比

可见度 特点
public(公有的) 实例变量可以在类的外面和内部操作
protected(保护的) 实例变量只能在该类和其子类内操作
private(私有的) 实例对象只能在该类内访问,能不子类继承,但无法访问

    注意:所谓的内部,是指@implementation和@end之间

    示例:

@interface Student : NSObject
{
    //默认:受保护的
    NSString *_name;
    //公有的,对外可以直接访问
@public
    NSString *_sex;
    
    //private和protected区别?
    //保护的,对外不可以直接访问,子类可以访问
@protected
    CGFloat _score;
    
    //私有的,对外不可以访问,子类可以继承但不可以访问
@private
    NSInteger _num;
}

二. 方法

    方法分类:类方法(+),实例方法(-)

            类方法:只能类使用 +(id)alloc

             实例方法:只能对象使用 - (void)sayHi

     方法声明:

- (void)setName:(NSString *)name;
//多个参数形式!!!
//方法类型标志符 (返回值类型)参数形容词1:(参数类型)参数名1 参数形容词2:(参数类型)参数名2;
//方法的所有形容词共同组成方法的名字
//方法形容词可以省略, ':' 一定要有
- (void)setName:(NSString *)name sex:(NSString *)sex;

    取值,赋值方法声明

//setter方法 - 间接访问实例变量(写)
- (void)setName:(NSString *)name;
//getter方法 - 间接访问实例变量(读)
//注意命名时不要写成getName
- (NSString *)name ;

    取值,赋值方法实现

- (NSString *) name
{
    return _name;
}
- (void) setName:(NSString *)name
{
    _name = name;
}

    自定义初始化

- (id) initWithName:(NSString *)name sex:(NSString *)sex num:(NSInteger)num score:(CGFloat)score
{
    _name = name;
    _sex  = sex;
    _num = num;
    _score = score;
    return self;
}

    #import

            导入头文件,即:导入头文件中的内容到当前类。

            #import “”导入自定义类,#import <>导入类库中的头文件。

            功能类似C语言中的#include,但是可以避免头文件被重复导入。

            容易出现循环导入头文件问题。

    @class

        告诉编译器@class后的字符串作为类名使用,并未导入类的接口内容。

        有效避免嵌套循环导入。        

 三.总结

    实例变量有3种常见的可见度:@public、@protected、@private。

    @public违背了封装特性,面向对象开发中很少使用;

    @protected默认可见度,自己和子类中能使用—>访问实例变量;

    @private自己类中能使用—>访问实例变量。

    方法是OC的核心,采用消息机制:[receiver message]。“-”message由对象来调用;“+”message由类来调用。

代码:

    Student.h

#import <Foundation/Foundation.h>
//@class告诉编译器,后面字符串作类名使用,并未导入类的接口内容
//有效避免嵌套循环导入.
@class A;
@interface Student : NSObject
{
    //默认:受保护的
    NSString *_name;
    //公有德,对外可以直接访问
@public
    NSString *_sex;
    
    //private和protected区别?
    //保护的,对外不可以直接访问,子类可以访问
@protected
    CGFloat _score;
    
    //私有的,对外不可以访问,子类可以继承但不可以访问
@private
    NSInteger _num;
}
//setter方法 - 间接访问实例变量(写)
- (void)setName:(NSString *)name;
//getter方法 - 间接访问实例变量(读)
//注意命名时不要写成getName
- (NSString *)name ;

- (void)setSex:(NSString *)sex;
- (NSString *)sex;

- (void)setNum:(NSInteger)num;
- (NSInteger)num;

- (void)setScore:(CGFloat)score;
- (CGFloat)score;

//多个参数形式!!!
//方法类型标志符 (返回值类型)参数形容词1:(参数类型)参数名1 参数形容词2:(参数类型)参数名2;
//方法的所有形容词共同组成方法的名字
//方法形容词可以省略, ':' 一定要有
- (void)setName:(NSString *)name sex:(NSString *)sex;
- (void)sumWithNum1:(NSInteger)num1 num2:(NSInteger)num2 num3:(NSInteger)num3;


//重写init方法
- (id) initWithName:(NSString *)name sex:(NSString *)sex num:(NSInteger)num score:(CGFloat)score;

- (void) info;

@end

    Student.m

#import "Student.h"

@implementation Student


- (void)setName:(NSString *)name sex:(NSString *)sex
{
    _name = name;
    _sex = sex;
}
- (void)sumWithNum1:(NSInteger)num1 num2:(NSInteger)num2 num3:(NSInteger)num3
{
    NSLog(@"%ld", num1 + num2 + num3);
}




- (NSString *) name
{
    return _name;
}
- (void) setName:(NSString *)name
{
    _name = name;
}

//Sex
- (NSString *) sex
{
    return _sex;
}

- (void) setSex:(NSString *)sex
{
    _sex = sex;
}


//Num
- (void) setNum:(NSInteger)num
{
    _num  = num;
}
- (NSInteger) num
{
    return _num;
}

//Score
- (void) setScore:(CGFloat)score
{
    _score = score;
}

- (CGFloat) score
{
    return _score;
}

- (void) info
{
    NSLog(@"%@ %@ %.2f %ld", _name, _sex, _score, _num);
}

//重写系统方法,可以不用声明
- (id) initWithName:(NSString *)name sex:(NSString *)sex num:(NSInteger)num score:(CGFloat)score
{
    _name = name;
    _sex  = sex;
    _num = num;
    _score = score;
    return self;
}

@end

    main.m

#import <Foundation/Foundation.h>
#import "Student.h"
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        /*--------------------------------------------------------------*/

        Student *stu = [[Student alloc] init];
        
        [stu setName:@"河俊"];
        [stu setNum:22];
        [stu setSex:@"男"];
        [stu setScore:98.00];
        [stu info];
        //NSLog(@"%@ %@ %.2f %ld" , [stu name], [stu sex], [stu score], [stu num]);
        
        [stu setName:@"庆春" sex:@"男"];
        //NSLog(@"%@ %@ %.2f %ld" , [stu name], [stu sex], [stu score], [stu num]);
        [stu info];
        
        NSString *ns = [stu name];
        NSLog(@"%@", ns);
        [stu info];
        
        [stu sumWithNum1:3 num2:9 num3:7];
        
        /*---------------------重写init实现初始化--------------------------------------*/
        Student *stu2 = [Student alloc];
        
        //在初始化的时候为stu中实例变量赋值
        stu2 = [stu initWithName:@"博阳" sex:@"男" num:13 score:99];
        [stu2 info];
        
        
    }
    return 0;
}










你可能感兴趣的:(方法,实例变量可见度)