黑马程序员 OC语言 - 3 面向对象(下)

来源:互联网 发布:微博域名可以修改吗 编辑:程序博客网 时间:2024/06/05 05:28

若排版有错误,请查看:http://pan.baidu.com/s/1pJDLqeJ



一、 面向对象的三大特征

(一)   封装

@interface Student : NSObject

    {

    int _age;

    int _no;

}

 

1.      set方法

-   (void)setAge:(int)newAge;

 

   作用:

提供一个方法给外界设置成员变量值,可以在方法里面对参数进行相应过滤

 

   命名规范:

1)  方法名必须以set开头

2)  set后面跟上成员变量的名称,成员变量的首字母必须大写

3)  返回值一定是void

4)  一定要接收一个参数,而且参数类型跟成员变量类型一致

5)  形参的名称不能跟成员变量名一样

 

2.      get方法

-   (int)age;

 

   作用:

返回对象内部的成员变量,只允许外界访问成员变量,不允许修改成员变量

 

   命名规范:

1)  肯定有返回值,返回值类型肯定与成员变量类型一致

2)  方法名跟成员变量名一样

3)  不需要接收任何参数

 

@end

 

    @implementation Student

 

    // set方法的实现

    - (void)setAge:(int)newAge

    {

      // 对传进来的参数进行过滤

      if (newAge <= 0)

      {

             newAge= 1;

      }

   

      _age= newAge;

    }

 

    - (int)age

    {

        return _age;

    }

    @end

 

 

    int main()

    {

        Student *stu = [Studentnew];

   

        [stu setAge:10];

   

        NSLog(@"学生的年龄是%d", [stu age]);

        return 0;

    }

 

3.      成员变量的命名规范

l   一定要以下划线 _ 开头

 

            作用:

1)  让成员变量和get方法的名称区分开

2)  可以跟局部变量区分开,一看到下划线开头的变量,一般都是成员变量

 

4.      类方法与对象方法

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

2)     类方法和对象方法可以同名,也可以相互调用

 

类方法:

1)  加号 + 开头

2)  只能由类(名)来调用

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

4)  不依赖于对象,执行效率高

5)  能用类方法,尽量用类方法

6)  场合:当方法内部不需要使用到成员变量时,就可以改为类方法

 

对象方法:

1)  减号 - 开头

2)  只能由对象来调用

3)  对象方法中能访问当前对象的成员变量(实例变量)

 

1.     self关键字

self是一个指针,指向方法调用者(当前对象或当前类),谁调用就指向谁。

1)  在对象方法中可用self->成员变量名 访问成员变量

2)  [self 方法名]可以调用其他对象方法、类方法,方法名如果与当前方法名相同就会产生死循环

 

    - (void)test

    {

        // self:指向了方向调用者,代表着当期对象

        int _age = 20; // _age为局部变量

        NSLog(@"Person的年龄是%d",self->_age);//不是20,而是当前对象方法的成员变量的值

         }

 

    - (void)test

    {

        [self test]; // 会引发死循环

    }

 

(二)   继承

1.      什么是继承

类A

类B : 类A

就是类B包含类A的所有特征(成员变量、方法),类A称为类B的父类,类B称为类A的子类

 

2.      基本使用

    @interface Animal : NSObject

    …

    @end

 

    implementation Animal

    …

    @end

   

    @interface Dog : Animal // : Animal继承了Animal,相当于拥有了Animal里面的所有成员变量和方法

    @end

 

    @implementation Dog

    @end

 

3.      继承的好处

1)  抽取重复代码

2)  建立了类之间的关系

3)  子类可以拥有父类中的所有成员变量和方法

 

4.      继承的坏处

耦合性太强

 

5.      注意点

1)  基本上所有类的根类是NSObject

2)  父类必须声明在子类的前面

3)  不允许子类和父类拥有相同的成员变量,

4)  允许有相同的方法,调用某个方法时,优先去当前类中找,如果找不到,去父类中找

5)  重写:子类重新实现父类中的某个方法,覆盖父类以前的做法

 

6.      继承的使用场合

1)  当两个类拥有相同属性和方法的时候,就可以将相同的东西抽取到一个父类中

2)  当A类完全拥有B类中的部分属性和方法时,可以考虑让B类继承A类

 

2.     组合

继承:XX是XXX

组合:XX拥有XXX

 

    @interface Score : NSObject

    {

        int _cScore;

        int _ocScore;

    }

    @end

    @implementation Score

    @end

 

    @interface Student : NSObject

    {

        // 组合

        Score *_score;

     // int _cScore;

     // int _ocScore;

        int _age;

    }

    @end

    @implementation Student

    @end

 

3.     super关键字

1)  直接调用父类中的某个方法

2)  super处在对象方法中,那么就会调用父类的对象方法

3)  super处在类方法中,那么就会调用父类的类方法

4)  使用场合:子类重写父类的方法时想保留父类的一些行为

 

(三)   多态

1.      什么是多态

1)     没有继承就没有多态

2)     多态(多种形态):父类指针指向子类对象。

 

2.      好处

如果函数、方法参数中使用的是父类类型,可以传入父类、子类对象

 

3.      局限性

父类类型的变量不能用来调用子类的方法;必须强制转为子类类型才能调用

 

4.      基本使用

    // 动物

    @interface Animal : NSObject

    - (void)eat;

    @end

 

    @implementation Animal

    - (void)eat

    {

        NSLog(@"Animal-吃东西----");

    }

    @end

 

    //

    @interface Dog : Animal

    - (void)run;

    @end

 

    @implementation  Dog

    - (void)run

    {

        NSLog(@"Dog---跑起来");

    }

    - (void)eat

    {

        NSLog(@"Dog-吃东西----");

    }

    @end

 

    // 如果参数中使用的是父类类型,可以传入父类、子类对象

    void feed(Animal *a)

    {

        [a eat];

 }

 

    int main()

    {

        Dog *d = [Dog new]; // Dog类型

   

        Animal *a = [Dog new]; // 多态(多种形态):父类指针指向子类对象

   

        [a eat]; // 输出:Dog//调用方法时会检测对象的真实形象

 

        Animal *aa = [Dog new];

   

        //[aa run]; 多态的局限性:父类类型的变量不能用来调用子类的方法;必须强制转为子类类型才能调用

        Dog *dd = (Dog *)aa; // aa转为Dog*类型的变量

 [dd run];

 

        return 0;

}

 

4.     NSString

创建字符串:

1)     NSString *str = @"itcast";

2)     char *c = "itcast";

NSLog(@"%@", str);

NSLog(@"%s", c);

 

int age = 15;

int no = 5;

NSString *name = @"哈哈jack";

int size = [name length]; // 6 length方法算的是字数

 

3)     NSString *newStr = [NSStringstringWithFormat:@"My age is %d and no is %d and name is %@", age, no, name];

 

总结

1.       只有利用类名调用类方法的时候,不需要在类名后面写*。其他情况下,类名后面统一加上一个*

    Circle *c1 = [Circle new];

    - (BOOL)isInteractWithOther:(Circle *)other;

 

2.       返回值是BOOL类型的方法,方法名一般都以is开头

    - (BOOL)isInteractWithOther:(Circle *)other;

 

3.       想要拥有某个对象,就先创建对象,然后调用set方法将对象传递给内部的成员变量

    //创建圆心对象

    Point2D *p1 = [Point2D new];

    [p1 setX:1 andY:2];

    // 设置圆心

    [c1setPoint:p1];

 

    //setPoint方法的实现

    - (void)setPoint:(Point2D *)point

    {

         _point = point;

    }

 

4.       定义一个类分2个文件:.h声明文件、.m实现文件

         .h : 成员变量、方法的声明

         .m : 方法的实现

 

5.       如果想使用某一个类,只需要#import类的.h文件即可

 


0 0
原创粉丝点击