黑马程序员-IOS-OC基础-面向对象语法二

来源:互联网 发布:知乎 广场舞大妈 编辑:程序博客网 时间:2024/05/01 16:36

-------------------------------------- android培训java培训、ios培训期待与您交流! ---------------------------------

类的合理设计

/*  学生: 成员变量:性别、生日、体重、最喜欢的颜色、狗(体重、毛色、吃、跑) 方法:吃、跑、遛狗(让狗跑)、喂狗(让狗吃) */#import <Foundation/Foundation.h>typedef enum{    SexMan,    SexWoman}Sex;typedef struct {    int year;    int month;    int day;}Date;typedef enum{    ColorRed,    ColorBlack} Color;typedef enum{    DogColorRed,    DogColorWhite} DogColor;//狗@interface Dog : NSObject{@public    int weight;    DogColor skincolor;    }-(void)eat;-(void)run;@end@implementation Dog-(void)eat{    NSLog(@"吃骨头");}-(void)run{    NSLog(@"追兔子");}@end//学生@interface Student : NSObject{    @public    Sex sex;    Date birthday;    double weight;    Color favirate;        Dog *mydog;}-(void)eat;-(void)run;-(void)liugou;-(void)feedog;@end@implementation Student-(void)eat{    NSLog(@"吃东西");}-(void)run{    NSLog(@"在跑");}-(void)liugou{    [mydog run];}-(void)feedog{    [mydog eat];}@endint main(){    Student *s = [Student new];    Dog *g = [Dog new];    s->mydog = g;//把[Dog new]指针赋值给s指向的指针mydog    s->sex = SexMan;    Date d = {1999,8,9};    s->birthday = d;    s->weight = 60;    s->favirate = ColorBlack;    [s liugou];    [s feedog];    [s run];                g->weight = 30;    g->skincolor = DogColorRed;    //[g run];    //[g eat];        return 0;}

 set方法和get方法

1.       set方法和get方法的使用场合

@public的成员可以被随意赋值,应该使用set方法和get方法来管理成员的访问(类似机场的安检、水龙头过滤,过滤掉不合理的东西),比如僵尸的生命值不能为负数

2.       set方法

1)  作用:用来设置成员变量,可以在方法里面过滤掉一些不合理的值

2)  命名规范:

Ø   方法都是以set开头,而且后面跟上成员变量名,成员变量名的首字母必须大写

Ø   形参名称不要跟成员变量同名

3.       get方法

1)  作用:返回对象内部的成员变量

2)  命名规范:get方法的名称一般就跟成员变量同名

4.       成员变量的命名规范

Ø   成员变量都以下划线 _开头

Ø   可以跟get方法的名称区分开

Ø   可以跟其他局部变量区分开,一看到下划线开头的变量,肯定是成员变量

#import <Foundation/Foundation.h>// 声明@interface Car : NSObject{    int _wheels; // 轮子个数}/*set方法*/- (void) setWheels:(int)wheels;/*get方法*/- (int) wheels;@end@implementation Car// set方法的实现- (void) setWheels:(int)wheels{    // 对外面传进来的轮子数进行过滤    if (wheels<=0)    {        wheels = 1;    }        _wheels = wheels;}// get方法的实现- (int) wheels{    return _wheels;}@end


面向对象的三大特性

面向对象的三大特性:封装、继承、多态
1,封装
<1>封装的好处:
1,过滤不合理的值。2,屏蔽内部的赋值过程。3,让外界不必关注内部的细节。
//封装  #import <Foundation/Foundation.h>    @interface Student : NSObject  {      /*      成员变量得到命名规范:一定要以下划线 _开头      作用是:      1,让成员变量和get方法的名称区分开;      2,可以跟局部变量区分开,      */      //@public   //成员变量尽量不要用@public      int _age;    }  /*set方法  1,作用:提供一个方法给外界设置成员变量值  2.命名规范:  1>,方法名必须以set开头  2>,set后面跟上成员变量的名称,成员变量的字母必须大写(setAge)  3>,返回值一定是void  4>,一定要接收一个参数,而且参数类型跟成员变量类型一致  5>,形参的名称不能跟成员变量名一样  */  //声明set方法  - (void)setAge:(int)age;  /*  get方法  1,作用:返回对象内部的成员变量。  2,命名规范:  1>,肯定有返回值,返回值类型与成员变量类型一致  2>,方法名跟成员变量名一致  3>,不需要接收任何参数  */  //声明get方法  - (int)age;  //声明study方法  - (void)study;  @end    @implementation Student  //实现set方法  - (void)setAge:(int)age  {      //对传进来的参数进过滤      if (age <= 0)      {          age = 1;      }      _age = age;  }  //实现get方法  - (int)age  {      return _age;  }  //实现study方法  - (void)study  {        NSLog(@"%d岁的学生在学习",_age);  }  @end    int main()  {      //创建Student类对象      Student *s = [Student new];      //s ->_age = 10; //成员变量加@public才可以这样做,但是尽量不要这样。      [s setAge:25];      [s study];      NSLog(@"学生的年龄%d",[s age]);      return 0;  }  

类方法

1.    基本概念

直接可以用类名来执行的方法(类本身会在内存中占据存储空间,里面有类\对象方法列表)

2.    类方法和对象方法对比

1)  对象方法

Ø   以减号-开头

Ø   只能让对象调用,没有对象,这个方法根本不可能被执行

Ø   对象方法能访问实例变量(成员变量)

 

2)  类方法

Ø   以加号+开头

Ø   只能用类名调用,对象不能调用

Ø   类方法中不能访问实例变量(成员变量)

Ø  使用场合:当不需要访问成员变量的时候,尽量用类方法

3)      类方法和对象方法可以同名

#import <Foundation/Foundation.h>/* 对象方法 1> 减号 - 开头 2> 只能由对象来调用 3> 对象方法中能访问当前对象的成员变量(实例变量)  类方法 1> 加号 + 开头 2> 只能由类(名)来调用 3> 类方法中不能访问成员变量(实例变量)   类方法的好处和使用场合 1> 不依赖于对象,执行效率高 2> 能用类方法,尽量用类方法 3> 场合:当方法内部不需要使用到成员变量时,就可以改为类方法  可以允许类方法和对象方法同名 */@interface Person : NSObject{    int age;}// 类方法都是以+开头+ (void)printClassName;- (void)test;+ (void)test;@end@implementation Person+ (void)printClassName{    // error:instance variable 'age' accessed in class method    // 实例变量age不能在类方法中访问    //NSLog(@"这个类叫做Person-%d", age);}- (void)test{    NSLog(@"111-%d", age);        //[Person test];}+ (void)test{    // 会引发死循环    //[Person test];        NSLog(@"333");        // 会引发死循环//    /[Person test];}@endint main(){    //[Person printClassName];        [Person test];        //Person *p = [Person new];    //[p test];        /*     -[Person printClassName]: unrecognized selector sent to instance 0x7fa520c0b370     */    // 系统会认为现在调用的printClassName是个对象方法    //[p printClassName];        return 0;}

小练习:
/* 设计一个计算器类 * 求和 * 求平均值 */#import <Foundation/Foundation.h>// 工具类:基本没有任何成员变量,里面的方法基本都是类方法@interface JiSusnQi : NSObject+ (int)sumOfNum1:(int)num1 andNum2:(int)num2;+ (int)averageOfNum1:(int)num1 andNum2:(int)num2;@end@implementation JiSusnQi+ (int)sumOfNum1:(int)num1 andNum2:(int)num2{    return num1 + num2;}+ (int)averageOfNum1:(int)num1 andNum2:(int)num2{    int sum = [JiSusnQi sumOfNum1:num1 andNum2:num2];    return sum / 2;}@endint main(){    int a = [JiSusnQi averageOfNum1:10 andNum2:12];        NSLog(@"a=%d", a);    //    JiSusnQi *jsq = [JiSusnQi new];//    //    //    [jsq sumOfNum1:10 andNum2:13];        return 0;}





-------------------------------------- android培训java培训、ios培训期待与您交流! ---------------------------------
0 0