黑马程序员——OC基础:类和对象

时间:2021-07-22 00:32:10

类:一类事物共同特征和行为的抽象

对象:类的具体的个体

 

类的定义:

    1)类的声明(规定当前类的:类名、属性、行为)

         @interface 类名:父类名

         {

            // 定义类的属性

         }

         // 类的行为

         @end

    2)类的实现(实现具体行为)

         @implementation 类名

         // 行为的具体实现

         @end

 

对象的创建:

    Car *p = [Car new]; // Car类实例化了一个实例对象,对象的名称是p

    [Car new] 做了3件事情:

         1)向计算机申请内存空间

         2)给类中的每一个成员初始化值

         3)返回新申请的空间的首地址


实例1:

 实现:

 类名:苹果手机(Iphone

 属性:颜色(_color),大小(_size),处理器(_cpu

 行为:查看本机信息(aboutMyPhone),打电话(call),发短信(sendMessage

 实现该类,并

 1)查看本机信息

 2)打电话给10086

 3)给10086发短信询问联通的客服电话是多少


#import <Foundation/Foundation.h>


// 苹果手机类的声明

@interface Iphone : NSObject

{

    @public

    // 属性

    NSString *_color; // 颜色

    float _size; // 尺寸

    NSString* _cpu; // cpu

}

// 行为

-(void)aboutMyPhone; // 查看本机信息

-(void)callto: (int)num; // 打电话

-(void)sendMessageTo: (int)num ofMessage: (NSString *)message; // 发短信


@end


// 苹果手机类的实现

@implementation Iphone


// 查看本机信息

-(void)aboutMyPhone{

    NSLog(@"颜色:%@,尺寸:%.1f,cpu%@",self->_color, self->_size, self->_cpu);

}


// 打电话

-(void)callto: (int)num{

    printf("正在打电话给%d\n",num);

}


// 发短信

-(void)sendMessageTo: (int)num ofMessage: (NSString *)message{

    NSLog(@"正在给%d发短信:%@",num, message);

}


@end


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

    @autoreleasepool {

        

        // 创建对象并赋值

        Iphone *myIphone = [Iphone new];

        myIphone ->_color = @"gold";

        myIphone ->_size = 4.7;

        myIphone ->_cpu = @"A8";

        

        // 查看本机信息

        [myIphone aboutMyPhone];

        

        // 打电话

        [myIphone callto:10086];

        

        // 发短信

        [myIphone sendMessageTo:10086 ofMessage:@"联通的客服电话是多少?"];

        

    }

    return 0;

}



/*

 实例2一个人可以吃不同的食物,只要吃东西体重就会增加0.6,如果出门遛弯,每走100步,体重减0.2,小于100步忽略不计。请用面向对象思想实现。

 */


#import <Foundation/Foundation.h>

// 类的声明

#pragma mark Person类的声明

@interface Person : NSObject

{

    @public

    // 成员变量

    NSString *name; // 姓名

    int age; // 年龄

    float weight; // 体重

}

// 方法

-(void)eat: (NSString *)food; // 吃东西

-(void)walk: (int)num; // 走路


@end


// 类的实现

#pragma mark -

#pragma mark Person类的实现

@implementation Person


// 方法

-(void)eat: (NSString *)food{ // 吃东西

    weight += 0.6f; // 体重增加

    NSLog(@"%@吃了%@,体重变为%.1f\n", name, food, weight);

}


-(void)walk: (int)num{ // 走路

    weight -= num / 100 * 0.2; // 体重减少

    NSLog(@"%@走了%d步,体重变为%.1f\n", name, num, weight);

}


@end


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

    @autoreleasepool {

        // 创建对象

        Person *p = [Person new];

        

        // 给对象的成员变量赋值

        p -> name = @"怪叔叔";

        p -> age = 44;

        p -> weight = 160;

        

        // 调用方法

        [p eat:@"萝莉汁"];

        [p walk:345];

    }

    return 0;

}




/*

实例3

1.设计一个

 1)属性

 狗名

 颜色

 速度(单位是m/s

 性别

 体重(单位是kg

 

 2)行为

 吃:每吃一次,体重增加0.5kg,输出吃完后的体重

 叫:输出所有属性

 跑:每跑一次,体重减少0.5kg,输出速度和跑完后的体重

 比较颜色:跟别的狗比较颜色,如果一样,两个值做减法得零,返回NO(零值),不一样,做减法得到非零值,返回YES1

 比较速度:跟别的狗比较速度,返回速度差(自己的速度 - 其他狗的速度)

 

2.结合前面的类,设计一个

 1)属性

 姓名

 狗(养了一条狗)

 

 2)行为

 喂狗:每喂一次,狗就会执行这个行为

 遛狗:每遛一次,狗就会执行这个行为

 */


#import <Foundation/Foundation.h>


// 狗的颜色

typedef enum{

    colorWhite,

    colorBlack,

    colorYellow,

    colorBrown

} dogColor;


//狗的性别

typedef enum{

    sexMale,

    sexFemale

} dogSex;


// 声明狗类

#pragma mark 狗类的声明

@interface Dog : NSObject

{

    @public

    // 狗的成员变量

    NSString *_name; // 狗名

    dogColor _color; // 颜色

    int _speed; // 速度

    dogSex _sex; // 性别

    float _weight; // 体重

}


// 狗的行为

-(void)eat; //

-(void)bark; //

-(void)run; //

-(BOOL) compareColorWithOther: (Dog *)other; // 比较颜色

-(int) compareSpeedWithOther: (Dog *)other; // 比较速度

@end


// 狗类的实现

#pragma mark 狗类的实现

@implementation Dog


//

-(void)eat{

    _weight += 0.5f;

    NSLog(@"%@吃完后的体重为:%.1fkg",_name,_weight);

}


//

-(void)bark{

    NSLog(@"%@的颜色:%d 速度:%dm/s 性别:%d 体重:%.1fkg",_name, _color, _speed, _sex, _weight);

}


//

-(void)run{

    _weight -= 0.5f;

    NSLog(@"%@的速度:%dm/s 跑完后的体重:%.1fkg",_name, _speed, _weight);

}


// 比较颜色

-(BOOL) compareColorWithOther: (Dog *)other{

    return _color - other->_color == 0 ? 0 : 1;

}


// 比较速度

-(int) compareSpeedWithOther: (Dog *)other{

    return _speed - other->_speed;

}



@end


// 人类的声明

#pragma mark -

#pragma mark 人类的声明

@interface Person : NSObject

{

    @public

    // 人的成员变量

    NSString *_name; // 姓名

    Dog *_dog; //

}

// 人类的行为

-(void)feedDog:(NSString*)foodName; // 喂狗

-(void)walkDog:(int)distance; // 遛狗


@end


// 人类的行为实现

#pragma mark 人类行为的实现

@implementation Person


// 喂狗

-(void)feedDog:(NSString*)foodName{

    NSLog(@"%@%@吃了%@", _name, _dog->_name, foodName);

    [_dog eat];

}

// 遛狗

-(void)walkDog:(int)distance{

    NSLog(@"%@%@走了%d", _name, _dog->_name, distance);

    [_dog run];

}



@end

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

    @autoreleasepool {

        

        // 创建狗1对象并赋值

        Dog *dog1 = [Dog new];

        dog1 -> _name = @"萝莉狗";

        dog1 -> _color = colorBlack;

        dog1 -> _speed = 80;

        dog1 -> _sex = sexFemale;

        dog1 -> _weight = 20.4f;

        

        // 创建狗2对象并赋值

        Dog *dog2 = [Dog new];

        dog2 -> _name = @"dog2";

        dog2 -> _color = colorBrown;

        dog2 -> _speed = 78;

        dog2 -> _sex = sexMale;

        dog2 -> _weight = 23.4f;

        

        // 1

        [dog1 bark];

        

        // 1

        [dog1 eat];

        

        // 2

        [dog2 bark];

        

        // 2

        [dog2 run];

        

        // 1和狗2比颜色

        BOOL y = [dog1 compareColorWithOther:dog2];

        switch (y) {

            case 1:

                NSLog(@"两条狗的颜色不一样");

                break;

            case 0:

                NSLog(@"两条狗的颜色一样");

                break;

            default:

                break;

        }

        

        // 2和狗1比速度

        int s = [dog2 compareSpeedWithOther:dog1];

        NSLog(@"两条狗的速度差为:%dm/s", s);

        

        // 创建人对象并赋值

        Person *p = [Person new];

        p -> _name = @"怪叔叔";

        p -> _dog = dog1;

        

        // 喂狗

        [p feedDog:@"便便粥"];

        

        // 遛狗

        [p walkDog:23];

    }

    return 0;

}




/*

实例4

 设计一个学生类,用结构体作为类的成员属性

 属性:姓名,生日

 */

#import <Foundation/Foundation.h>


typedef struct {

    int year;

    int month;

    int day;

} Date;


@interface Student : NSObject

{

    @public

    NSString * _name; // 姓名

    Date _birthday; // 生日

}

@end


@implementation Student


@end


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

    @autoreleasepool {

        

        // 创建学生对象方法1:逐个赋值

        Student *s1 = [Student new];

        s1 -> _name = @"萝莉酱";

        s1 -> _birthday.year = 2008;

        s1 -> _birthday.month = 11;

        s1 -> _birthday.day = 11;

        

        // 创建学生对象方法2:通过强制转换赋值

        Student *s2 = [Student new];

        s2 -> _birthday = (Date){2008,11,11};

        

        // 创建学生对象方法3:通过变量赋值

        Student *s3 = [Student new];

        Date d1 = {2003,11,11};

        s3 -> _birthday = d1;

        

        // 输出学生信息

        NSLog(@"姓名:%@ 生日:%d %d %d", s1 ->_name, s1 ->_birthday.year, s1 ->_birthday.month, s1 ->_birthday.day);

    }

    return 0;

}