[Objective-C] 02.Objective-C语法基础2

实例变量可见度:
  1. 三种可见度和特点:
    @public(公有的) : 实例变量可被任意操作
    @protected(受保护的): 实例变量只能在该类和子类中进行访问
    @private(私有的): 实例变量只能在该类中使用
    如果不写,默认是@protected
    实例代码:
    @interface Person : NSObject

     {

       // 公共的

       @public

        NSString *_address;             // 住址

      NSString *_hobby;               // 兴趣

        

       // 受保护的

       @protected

        NSString *_name;                // 姓名

        int _age;                       // 年龄

        

       // 私有的

       @private

        NSString *_sex;                 // 性别

        

    }

    @end

  2. 为什么我们很少使用@public?
    a. 使用@public暴露了类内部的细节
    b. 不符合面向对象的三大特性之一--封装
  3. 如果我们需要访问对象的私有属性或者受保护属性时怎么办?
    通过方法来访问:
    // Bank.h // 银行头文件

    #import 

    @interface Bank : NSObject

    {

        CGFloat _money;     // 存款

    }

    #pragma mark 存钱

    - (void)saveMoney:(CGFloat) yuan;

    #pragma mark 取钱

    - (CGFloat)getMondy;

    @end

    // Bank.m // 银行实现文件

    #import "Bank.h"

    @implementation Bank

    #pragma mrak 实现存钱方法

    - (void)saveMoney:(CGFloat)yuan

    {

        _money = yuan;

    }

    #pragma mark 实现取钱方法

    - (CGFloat)getMondy

    {

        return _money;

    }

    @end

    // 这样,我们在对银行类进行存钱、取钱操作时,就可以直接访问银行的对象// 实例化银行对象

    Bank *bank = [[Bank allocinit];

    // 进行存钱操作

    [bank saveMoney:100.0f];

    // 进行取钱操作

    NSLog(@"%f", [bank getMondy]);



方法:
  1. 方法分为两种:
    a. 类方法:只能类使用。例如:+(id)alloc; // 注意:类方法中不能使用实例变量
    b. 实例方法: 只能对象使用。例如:-(id)init;
  2. 方法名组成部分:
    方法类型标识符、返回值类型、参数形容词、参数类型、参数名称
    类中不能出现同名的方法
    “:”表示参数,不能省略
  3. 方法的使用:
    在OC中没有“person调用sayHi”这种表述
    在OC中使用消息发送机制:[接受者 方法]
    正确描述:
    a. person对象接收消息,即方法sayHi
    b. person找到sayHi方法,并执行。
  4. 自定义初始化方法:
    -(id)init 这个初始化方法只能给实例变量设置默认值,不灵活
    -(id)initWithName: 自定义初始化方法,根据需求定义初始化方法。


复合:
  1. 基本介绍:
    多个主见组合在一起,形成一个整体,然后使用整体进行工作,这种组合就叫复合
    OC中,类的实例变量是由其他类型组成
  2. #import:
    导入头文件,即将导入头文件中的内容,赋值到当前类
    #import ""导入自定义类, #import <> 导入类库中的头文件
    #import 功能类似C语言中的#include,但是可以避免头文件被重复包含
    容易出现循环引用问题
  3. @class关键字:
    标识字符串作为类名使用,无法导入类的接口内容。只是声明那是一个类,但是类中有什么内容不知道。
    可以有效避免嵌套循环引用问题。

@interface Person : NSObject

{

    // 声明实例变量

    // 公开的

    @public // 可以被任意访问,可见度最高

    NSString *_address;         // 地址

    NSString *_hobby;           // 爱好

    

    // 受保护的

    @protected // 可以被本类和子类访问,可见度中等

    NSString *_name;            // 姓名

    int _age;                   // 年龄

    

    // 私有的

    @private

    NSString *_sex;             // 性别

    BOOL _isMarried;            // 是否已婚

}


// 自己写一个初始化方法

// 在创建对象的时候就给所有实例变量赋值

// 注意初始化方法的开头:initWith...

- (id)initWithAddress:(NSString *)address

                hobby:(NSString *)hobby

                 name:(NSString *)name

                  age:(int)age

                  sex:(NSString *)sex

            isMarried:(BOOL)isMarried;


// 设置全部实例变量的值的方法

- (void)setAddress:(NSString *)address

             hobby:(NSString *)hobby

              name:(NSString *)name

               age:(int)age

               sex:(NSString *)sex

         isMarried:(BOOL)isMarried;


// 设置姓名的方法

// void setName(char *name);

- (void)setName:(NSString *)name;

// 一个冒号代表一个参数

// 冒号后面紧跟小括号,小括号内部是参数类型

// 类型后面,参数名称


// 取出姓名的值的方法

- (NSString *)getName;


// 同时设置多个实例变量内容的方法

- (void)setName:(NSString *)name

            age:(int)age

        address:(NSString *)address;


// 方法名(去除:类型、返回值、参数类型、参数名、所有小括号)

// setName:withAge:withAddress:


// - (void)setName:(NSString *)name

               // :(int)age

               // :(NSString *)address;

// 方法名:setName:::


// age的设置值和取值的方法

- (void)setAge:(int)age;

- (int)getAge;


// sex的设置值和取值的方法

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

- (NSString *)getSex;


// isMarried的设置值和取值的方法

- (void)setIsMarried:(BOOL)isMarried;

- (BOOL)getIsMarried;


@end



int main(int argc, const char * argv[])

{

    @autoreleasepool {

        

        // 创建person对象

        Person *person1 = [[Person allocinit];

        // 和上面写法一样,就是把allocinit合在了一起

        Person *person2 = [Person new];

        

        // 给实例变量赋值

        person1->_address = @"北京市海淀区";

        person1->_hobby = @"生乒乓球";

        

        // 受保护的,外界不可以访问

        // person1->_name = @"张赛赛";

        // person1->_sex = @"";

        

        // 通过方法设置了受保护的实例变量的值

        [person1 setName:@"张赛赛"];

        

        // 通过方法取出受保护的实例变量的值

        NSString *name = [person1 getName];

        NSLog(@"name = %@", name);

        

        // 同时设置了person2的姓名、年龄、地址

        [person2 setName:@"超超" age:18 address:@"北京市海淀区"];

        

        // 分别给实例变量赋值

        [person2 setName:@"张超超"];

        [person2 setAge:19];

        person2->_address = @"北京市朝阳区";

        

        NSLog(@"name = %@ age = %d address = %@", [person2 getName], [person2 getAge], person2->_address);

        

        

        

        // 使用普通方法设置的每个实例变量的值

        Person *person3 = [[Person allocinit];

        [person3 setAddress:@"花果山隔壁" hobby:@"公猩猩" name:@"猩猩(申耀昕)"age:43 sex:@"" isMarried:YES];

        

        // 使用自定义初始化方法创建的对象

        Person *person4 = [[Person allocinitWithAddress:@"花果山隔壁"hobby:@"公猩猩" name:@"猩猩(申耀昕)" age:43 sex:@"" isMarried:YES];

        NSLog(@"%@", person4);

        

        // 自定义初始化方法,创建的对象

        Person *person5 = [[Person allocinitWithAddress:@"高老庄"hobby:@"嫦娥" name:@"八戒、悟能、彪哥" age:43 sex:@"不详" isMarried:YES];

        

        

        // 打印一个对象的时候,其实就是打印[对象 description]方法的返回值

        // 我们可以重写description方法,打印出我们想要的结果

        NSLog(@"%@", person5);

        

        

        

        

        // 复合的体现,多个直接写的类,组合成了一个新的类。说白了就是组合

        // 1. 很多年前,咔嚓一声,赛赛出生了

        Father *father = [[Father allocinit];

        father->_name = @"赛赛";

        father->_age = 0;

        

        // 2. 在同一年,在邻村,漂亮的小姑娘,超超也出生了

        Mother *mother = [[Mother allocinit];

        mother->_name = @"超超";

        mother->_age = 0;

        

        // 3. 13年后,他俩相遇了。俩人一见钟情,决定在一起,于是,组建了家庭

        father->_age = 13;

        mother->_age = 13;

        

        Family *family = [[Family allocinit];

        family->_father = father;

        family->_mother = mother;

        

        // 4. 半个月后,生了个小宝宝:超赛

        Child *child = [[Child allocinit];

        child->_name = @"超赛";

        family->_child = child;

        

        // 打印家庭成员的姓名

        NSLog(@"fatherName = %@   motherName = %@  childName = %@", family->_father->_name, family->_mother->_name, family->_child->_name);

        

    }

    return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值