您的位置:首页 > 职场人生

黑马程序员—IOS基础视频—多态点语法类对象

2015-08-25 16:23 369 查看
一. 多态

1. 多态概念,定义

什么是多态:

    多态就是某一类事物的多种形态;

官方一点说:

    多态就是,不同的对象以自己的方式响应父类同名的方法,这就是多态;

代码中体现出来:

    父类的指针指向了子类的对象;Animal *ani = [Dog new];

多态条件:

    1.有继承关系

    2.有方法的重写

2.多态代码实现:

//实例化猫的对象

Animal *animal  = [Cat new]; //父类的指针指向子类对象;

[animal eat];

//实例化狗的对象

animal = [Dog new]; //父类的指针指向子类对象。

[animal eat];

3.多态注意点:

1) 如果存在多态,父类是可以访问子类特有的方法

假设子类Dog 有一个特有的方法bark

Animal *an2 = [Dog new];         //编译时看等号左边,运行时看等号右边

[(Dog*)an2 bark]; //把父类的指针,强制类型转换

2) 如果不存在多态,父类是不可以访问子类特有的方法的

Animal *an3 = [Animal new];

[(Dog*)an3 bark]; //错误的,这里只是骗编译器,运行一定报错.

二.类对象

1,类的本质其实也是一个对象(类对象,Class类型);

类对象

    *类对象在程序运行时一直存在。

    *类对象是一种数据结构,存储类的基本信息:类大小,类名称,类的版本以及消息与函数的映射表等

    *每一个对象都包含一个指向其类对象的isa指针。

2、类对象如何获取

通过实例对象获取

Dog *d1 = [Dog new];

Dog *d2 = [Dog new];

Class c =   [d1 class];

Class c2 = [d2 class];

通过类名获取(类名其实就是类对象)

Class c3 = [ Dog  class ];

因为类对象在整个程序中只存在一份,

所以 c = c2 = c3

3.类对象的使用

1)可以用来调用类方法:

//获取类对象

Class c1 = [Person class];

//使用类对象调用类方法

[c1 test]; // test是一个+号方法

2)可以用来实例化实例对象, 并且调用对象方法

//获取类对象

Class c1 = [Person class];

//使用类对象创建实例对象

Person *p = [c1 new];

[p test];  // -test 调用对象方法

4. 类对象存储细节

通过打印地址分析测试:类对象存在常量区;

5.SEL类型 (@selector()选择器)

就是对方法的一种包装,将方法包装成SEL类型;

SEL是一种新的数据类型。和id、class一样。

Person *p = [Person new];

SEL s1 = @selector(test);

[p performSelector:s1];

三. 点语法

1. 传统setter, getter方法

-(void)setAge:(int)age{

    _age = age;

}

-(int)age{

    return _age;

}

2. 点语法

本质上展开之后相当于调用setter, getter方法

p.age = 10;  展开之后等价于   [p setAge:10];  // setter方法

NSString *name = p.age; 等价于NSString *name = [p name]; // getter方法

对象. 成员变量  展开之后到底是setter方法, 还是getter方法, 看在等号的左边还是右边,

如果是等号左边就是setter方法, 在等号右边是getter方法

3. 点语法陷阱 :

在set方法使用self.

- (void)setAge:(int)newAge {

    self.age = newAge;

}

4、点语法注意

点语法的本质是方法的调用,而不是访问成员变量,当使用点语法时,编译器会自动展开成相应的方法。

切记点语法的本质是转换成相应的set和get方法,如果没有set和get方法,则不能使用点语 法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: