黑马程序员——OC三大特性(继承、多态、封装)

------ Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
1. 封装(成员变量封装)
  优点:外界无法随意修改类中成员值或屏蔽类中成员变量,提高了程序安全性。
  在安全性前提下,外界访问类对象中成员值可通过以下方法:
 1.1 set方法(可读可写)
   作用:1>外界可以修改成员变量值。
             2>对外界传入的参数值进行过滤。
   命名规范:(1)方法名必须以set开头。
                     (2)set后面跟上成员变量的名称,且变量名首字母大写。
                     (3)返回值一定是void(无返回值)。
                     (4)set方法的形参名称不能跟成员变量名一样。
                     (5)一定有形参,且参数类型跟成员变量类型一样。
        eg: - (void)setAge:(int)age
                  {
                          _age=age;
                  }
   调用方法:和调用普通方法一样,[执行者 行为]
                eg: [p setAge:10];
 1.2 get方法(可读)
    作用:返回对象内部的成员变量。(只读)
    命名规范:(1)肯定有返回值,而且返回值类型与成员变量类型相同。
                     (2)方法名跟成员变量名相同
       eg: - (int)age
                {
                   return _age;
                }
    调用方法:和调用普通方法一样,[执行者 行为]
                  eg: int age=[p age];
1.3弱语法问题
       经典错误:
   eg:
   #import <Foundation/Foundation.h>
  @interface Person :NSObject  // 定义Person类
  @end
  @implementation Person // 实现Person方法
  @end
  int main()
{
  Person *p = [Person new];
  [p test];
}


    
   以上错误原因:指针并未找到相应的方法。(给对象Person发送了一个不能事变的方法test()
   注意点:1> OC是在运行过程中才会检测对象有没有 实现相应的方法。
                 2>程序闪退原因:程序在运行中出错。
 
2.类方法
    1>定义:直接使用类名进行调用。
    eg: [Person new];//Person类直接调用new方法
    2>语法:类方法都是以+开头
      eg:+ (void)run;// 声明一个run的类方法
  3>类方法和对象方法区别
 注意点:对象方法可以和类方法重名。
  4>对象方法和类方法的区别
 对象方法:
 (1)减号-开头
 (2)只能由对象来调用(首先要通过类创建方法)
 (3)对象方法能访问当前对象的成员变量
 (4)需要传递参数
  访问机制:首先通过对象指针访问对象,然后再通过对象内部的ISA指针访问类。(访问过程比较复杂)
类方法:
 (1)加号+开头
 (2)只能由类来调用
 (3)类方法不能访问成员变量
 (4)不需要传递参数 
 优点:不依赖于对象,执行效率高。
 使用场合:当方法内部不需要使用成员变量时,就可以使用类方法
 访问机制:直接访问类。

工具类:基本没有任何成员变量,而且其中的方法都是类方法。

3.self 
  概念: self是一个指针,指向方法的调用者(谁调用self,它就指向谁:如果是对像调用,则指向对象)。
      1>self在对象方法中,则self代表对象
      2>self在类方法中,则self代表类
  作用(只例举两个):
          (1)可访问当前对象内部的成员变量(self->成员变量)。
          (2)可直接调用当前对象的方法([self  方法])。 
 eg:
   - (void)setAge:(int)age // 设置age的set方法
      {
         _age=age;
        // 或者self->_age=age; 代表将age的值赋值给当前对象的_age成员属性。
       }

4.继承
   特点:子类一旦继承父类,则子类拥有父类中所有成员变量与方法。
    注:每个对象有个ISA指针,指向类,然后每个类中都有个指针superclass,指向父类。
具体访问结构图:
  
解释:1>对象根据ISA指针寻找Student类中的方法。
          2>如果在Student类中没找到,则类根据superclass指针在父类中寻找相关方法,以此类推,直到找到方法为止。
优点:
      (1)抽取重复代码,提高编程效率
      (2)建立了类之间的关系
      (3)子类拥有父类中所有属性和方法。
 缺点:偶合性较强。(父类的改变会影响到子类)
 注意点:
      (1)所有类的根类是NSObject。
      (2)子类和父类不能定义相同的成员变量(继承除外)。
      (3)父类必须声明在子类之前
      (4)调用某个方法时,优先在当前类中寻找,然后再去父类中寻找。(从下到上寻找)
 eg:
   
// 声明Person类
   @interface Person : NSObject  
{  
    int _age;  
    int _id;  
}  
// 声明属性的setter和getter方法
- (int)age;  
- (void)setAge:(int)age;  
@end  
  // 实现Person类
@implementation Person  
- (int)age {  
    return _age;  
}  
- (void)setAge:(int)age {  
    if(age < 0) {  
        age = 1;  
    }  
    _age = age;  
}  
@end  
 // 声明Student类,并继承Person类,关键点 冒号: 代表继承关系 
@interface Student : Person  
  
@end  

@implementation Student  
  
@end  
  
int main() {  
    Person *p = [Student new];  //学生同时也是人  
    
    return 0;  
}

以上代码显示:Student类继承了Person类,因此Student类拥有Person类的所有属性和方法

5.重写:
  概念:子类重新实现父类中的某个方法(对某个方法重新实现),覆盖父类某个方法以前的做法。
 使用场合:
       (1)当两个类拥有相同属性和方法的时候,就可以将相同的东西抽取到一个父类中
       (2)当A类有用B类中的部分属性和方法时,可以考虑让B类继承A类。

6.组合
   组合:XXX拥有XXX(B类拥有A类的属性,例如学生拥有成绩的属性)
  继承:XX是XXX(B类是A类,例如狗是动物)
  
@interface Student : NSObject
     {
    Score * _score;//Score是另外一个类,Student和Score类组合,Student拥有Score类的成员。
    int _Age;
     }


  组合的调用方法:
           [_score Cscore]; //Cscore是Score类中的成员属性。

7.Super
    子类调用父类中的某个方法
            super处于对象方法中时,那么就会调用父类的对象方法
            super处于类方法中时,那么就会调用父类的类方法
    使用场合:子类重写父类的方法时想要保留父类的一些行为
            (子类可以直接调用父类中的某个方法 [super 方法名])

eg: 在重写父类的基础上,再保留父类的方法。
  - (void)walk // 重写父类的walk方法
  {
   NSLog("跳两下");
  [super walk]; // 调用父类的walk方法
  }

8.多态
   0>概念:某一类事物的多种形态。(例如变形金刚)
   1>条件: 一定要有继承,没有继承就没有多态。
       Animal  *a=[dog new];//Animal是父类,dog是子类 , 狗是动物
       错误写法:Dog *d=[Animal new]; // 动物不一定是狗,也可能是猫
   2>优点:节省了代码,提高了效率。
        eg:如果方法或函数参数中使用的是父类类型,则可以使用父类指针传入父类和子类对象。
           void feed(Animal *a) // 定义喂动物的函数。
                    {
                      [a eat];
                   }
             解析:上述函数的形参是父类Animal,所以此函数可以传入父类和子类。
   3>局限性:
     父类类型的指针不能调用子类的方法。 (必须将父类指针强制转化为子类指针时才能调用子类中方法)
      eg:   Animal   * a=[dog new];             
             Dog *d = (dog *) a; // 将父指针a强制转化为子类指针d

8.OC字符串
   8.1 创建字符串方法
     1>NSString *str=@"OC String";//oc字符串以@开头
      2>NSString *str=[NSString stringWithFormat:@"my age is %d,number is %d",age,no];

  8.2 长度算法 
    长度算法:[str length]//直接调用NSObject中的length方法,且此方法算的是字数(包含空格),并不是字符数
   占位符:%@

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值