黑马程序员——OC 基础:实例变量修饰符,description方法和多态

来源:互联网 发布:2016免费翻墙软件 编辑:程序博客网 时间:2024/06/16 12:57

1.实例变量修饰符

   1@public(公开的)在有对象的前提下,任何地方都可以直接访问。

   2@protected (受保护的)只能在当前类和子类的对象方法中访问。

   3@private (私有的)只能在当前类的对象方法中才能直接访问。

   4@package (框架级别的)作用域介于私有和公开之间,只要处于同一框架就可以直接通过变量名访问。

  注意:

   1)在@interface @end之间声明的成员变量如果不作特别的说明,那么其默认是protected的。

   2)一个类继承了另一个类,那么就拥有了父类的所有成员变量和方法,注意所有的成员变量它都有,只是有的它不能直接访问。


2.description方法

   description方法是基类NSObject所带的方法,因为其默认实现是返回类名和对象的内存地址,这样的话,使用NSLog输出OC对象,意义就不是很大,因为我们并不关心,对象的内存地址,比较关心的是对象内部的一些成员变量值。因此,会经常重写description方法,覆盖description方法的默认实现。

   description方法默认返回对象的描述信息(默认实现是返回类名和对象的内存地址)

   NSLog(@"%@", objectA); //这会自动调用objectAdescription方法来输出ObjectA的描述信息。

 

 discription方法的使用

#import <Foundation/Foundation.h>


@interface Person : NSObject

{

    @public

    int _age;

    NSString *_name;

}


@end


@implementation Person


// 重写父类的description对象方法

-(NSString *)description{

    return [NSStringstringWithFormat:@"姓名:%@,年龄: %d",_name,_age];

}


// 重写父类的description类方法

+(NSString *)description{

    return@"调用了description类方法";

}


@end

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

    @autoreleasepool {

        

        // 创建对象并赋值

        Person *p = [Personnew];

        p -> _age = 13;

        p ->_name = @"luoli";

        

        // 调用pdescription方法

        NSLog(@"%@", p);

        

        // 利用对象调用description类方法

        NSLog(@"%@",[pclass]);

    }

    return 0;

}


3.多态

 3.1.什么是多态?

   多态就是某一类事物的多种形态。比如:小萝莉是女人,同时也是人,同时也是动物。

   程序中的多态:不同的对象以自己的方式响应相同名称方法的能力称为多态。

 

       多态的代码体现:用父类的指针指向了子类对象

   Person *p = [loli new];


 3.2.多态的条件

   1)有继承关系

   2)有方法重写:子类重写了父类的同名方法。

   3)父类的声明变量指向子类对象

 

 3.3.多态的优点

   多态的主要好处就是简化了编程接口。它容许在类和类之间重用一些习惯性的命名,而不用为每一个新加的函数命名一个新名字。

 

 3.4.多态的实现:

#import <Foundation/Foundation.h>


@interface Animal : NSObject

-(void)run;

@end


@implementation Animal


-(void)run{

    NSLog(@"动物跑");

}


@end


@interface Dog : Animal // 狗类继承了动物类


-(void)eat;

@end


@implementation Dog


-(void)run{

    NSLog(@"狗跑");// 重写了run方法

}


-(void)eat{

     NSLog(@"狗吃");

}


@end

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

    @autoreleasepool {

        

        //用父类指针指向了子类对象

        Animal *dog1 = [Dognew];

        

        [dog1 run]; // 调用的是狗类的方法

        

        //[dog1 eat]; 报错,dog1Animal类型的对象

        [(Dog *)dog1eat];// 多态的情况下用父类类型的对象调用子类的方法应该先把对象强制转换成子类类型

        

    }

    return 0;

}



0 0
原创粉丝点击