类与类之间的关系就像是所有的人都属于人这个类,而人这个类里又有一部分是残疾人,残疾人又可以变为一个类,也就是说人这个类里其实是可以包含残疾人这个类的,人类里的属性也可以是残疾人这个类里的属性,这里就涉及到一个继承的问题,也就是说相对于孩子和父亲的关系,人这个类就是父类,而残疾人这个类就是子类。OC中的继承其实就像现实中的父子关系,儿子继承了父亲的遗产,而派生就是父亲生了不止一个儿子。

这里有两个概念,一个是基类一个是父类,我理解的其实他们是一种东西,所以没必要再这里纠结。

继承:派生类继承基类。

派生类不但拥有基类的方法和属性,还拥有新增的方法和属性。

基类的私有属性能被继承,不能被访问

OC的继承是单继承,即一个类只能是继承一个父类,不能继承多个父类

方法的重写:

把父类的方法重写在子类中实现,做子类该做的事情,用子类调用父类的重写方法是,先调用自己类中的重写方法,若自己类中无该方法,则找父类的方法,如果还没有就找父父类,知道找到基类(NSObject)为止。

比如重写desription方法:

当我们以%@的格式打印了对象此时调用了desription方法,打印出来的就是当前类的地址,这样的话其实用NSLog输出的意义就不大,因为我们不关心他的地址,关心的是一些成员变量的值。所以会经常重写desription方法,覆盖desreption方法的默认实现,以达到我们自己所要达到的目的。

desription方法的实例:

Dog *d = [Dog new];
        [d setAge:3];
        d->_color  = 1;
         //查看对象地址
        NSLog(@"\n d = %p",d);
        //类名    对象的地址
         //需求:
        //当我们以%@格式打印 对象的时候,输出对象的所有的属性信息
        NSLog(@"\n%@",d); //打印d的对象


此时我们打印出来的并不能满足上诉的需求,打印出来的是一个Dog的地址,想要满足上诉需求就呀重写desription方法,代码如下:

@implementation Dog
-(void)setAge:(int)age{
   _age = age;
}
-(int)age{
   return _age;
}
-(void)run{
   NSLog(@"狗在跑");
}
//重写父类的description
-(NSString *)description{  
    return [NSString stringWithFormat:@"年龄:%d,颜色:%d",_age,_color];
}<pre name="code" class="objc">int main(int argc,const char * argv[])
{
         <pre name="code" class="objc">           Dog *d=[Dog new];



[d class]; ---->Dog
        //以%@的形式,打印类信息
        NSLog(@"\n%@ ",[d class]);
          return 0;


}




这样重写以后就能满足需求了。

在这里再介绍几个访问成员变量的修饰符:

@public类型在子类中正常访问,在任意程序都能访问。

@protected在同一类或派生类中可以访问(如果不专门声明的话,编译器默认就是此类型)。

@private只能访问同意类型的成员变量,子类不能继承不能访问。

OC类中的私有方法:在类的.h中没有声明,在.m中实现了此方法称为私有方法。