您的位置:首页 > 移动开发 > Objective-C

黑马程序员-----------Objective-c基础-----------继承和多态

2015-10-13 19:42 731 查看
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
一:self和super关键字介绍

1.OC提供了两个保留字self和super,用于在方法定义中引用执行该方法的对象。

OC中的self,就相当于C++和java中的this指针

2.设置器和访问器,提供外界操作内部类属性的一个通道

3.super调用父类的方法,可以重写一个已有的方法来修改或将它添加到现有的方法中,仍然可以将原来的方法纳入到修改后的方法中。

4.self应用场景

1)用在类方法中

2)用在对象方法中

3)访问成员变量

4)self在OC的内存管理特殊使用。(就业班的课)

5.self用在对象方法中

self在对象方法中使用其指向的是调用当前实例方法 的对象。

6.self用在类方法中

self用在类方法中使用其指向的是调用当前类方法的 当前类。

7.有一个Person类

Person *p = [Person new];

NSLog(@"\n Person = %p",[p class]); //[p class] 返回的是类Person的地址,也就是类对象。

8.self修饰变量

当一个对象方法的形参名和实例变量名相同时,形参将屏蔽实例变量,该对象方法类的该变量都将变成局部变量,要想在这种情况下访问实例变量,
可通过self->实例变量名来实现。

9.self使用总结

self谁调用当前方法,self就代表谁

[self 方法名称]; //调用其他方法(类方法/对象方法)

二:类的继承和派生

面向对象四大特性:封装,继承,多态,抽象

封装: 1)保护数据安全

2)隐藏复杂底层内容

3)隔离底层变化

继承:

注意事项:

1)子类不能定义和父类同名的变量

2)OC支持单一继承,不支持多继承

3)OC支持多层继承

继承体系中方法调用的顺序

1)在自己类中找

2)如果没有,去父类中找

3)如果父类中没有,就去父类的父类中

4)可以一直往上找,一直到基类(NSObject)

三:实例变量修饰符的介绍

1.实例变量的作用域

访问修饰符:public (任意程序集)

protected(同一类和派生类)

private(同一个类)

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

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

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

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

四:实例变量修饰符对子类的影响

1.@public和@protected可以被子类继承和访问

面试题:

@private 类型的变量,能否被子类继承

答:子类可以继承父类所有的实例变量和方法

@private 类型的变量,能否被子类访问

答:不能访问

2.实例变量作用域使用注意事项

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

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

五:OC中的私有变量

1.OC中的私有变量

1)在.m文件中定义的实例变量,是纯私有的变量,该变量只能在当前类中使用,不能被子类继承和访问。

2.OC中的私有方法

在.h文件中没有被声明,在.m文件中实现,此时该方法称为私有方法,不能被子类继承和访问。

*只能通过self在本类中访问私有方法

六:description方法介绍及重写

1.description方法概述

假如有一个类Person ,生成一个对象d

则:NSLog(@"\n d = %p",d); //打印的是对象的地址

NSLog(@"\n d= %@",d); //打印的是 类名: 对象的地址

当我们以%@打印对象时,实际上是调用了对象的description方法。

2.description重写的方法

-(NSString *)description{

return @"重写了description方法!";

}

或者:

-(NSString *)description{

NSString *str = [NSString stringWithFOrmat:@"年龄:%d,颜色:%d",_age,_color];

return str;

}

3.description陷阱

*重写description类方法时不能访问实例变量。

可以以%@形式打印类信息

NSLog(@"\n %@",[d class]);

千万不要在description方法中同时使用%@和self,会造成死循环

return [NSString stringWithFormat:@"%@",self];

七:多态的概念和条件

1.概念:不同对象对自己的方式响应相同名称方法的能力称为多态。

2.重点:多态的条件:

有继承关系,有方法重写

父类声明变量指向子类对象。

3.多态的优点:

[b]



4.多态的注意事项

1)Animal *an6 = [Dog new]; // Dog类里有eat方法,Animal类没有eat方法

// [an6 eat]; //报错

[(Dog *)an6 eat]; //正确

2)Animal *an6 = [Animal new]; // Dog类里有eat方法,Animal类没有eat方法

// [an6 eat]; //报错

[(Dog *)an6 eat]; //编译可以通过,骗过编译器,但执行会错误。

5.多态的实现

假如有:父类Animal ,子类:Cat和 Dog,三个类都有run方法

Animal *a2 = [Dog new];

[a2 run]; //实质上调用的是狗的run方法

6.多态的原理

动态绑定:



八:类的本质

1.类类型的变量(实例对象)

Person *p = [Person new]; //实例化对象做了三件事情:1)申请空间 2)初始化成员变量 3)返回空间首地址

//对象isa指向类对象(代码区地址)

p就是类类型的指针变量,指向实例对象

Person也一个对象(类对象),是Class类型的对象

2.类的本质其实也是一个对象(类对象)

定义:



3.类对象如何获取

1)通过实例对象获取

Dog *dog = [Dog new];

Dog *d2 = [Dog new];

//第一种方法获取类对象

Class c = [dog class];

Class c2 = [d2 class];

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

Class c3 = [Dog class];

九:类对象的使用

Person *p = [Person new];

Class c1 = [p class]; //c1---->Person

1)创建实例对象

Person *p1 = [c1 new];

2)调用类方法

[c1 test];

十:理解SEL类型

1.SEL:全称selector表示方法的存储位置。

2.Person *p = [Person new];

[p test];

寻找方法test的过程:

1)首先把test这个方法名包装成sel类型的数据;

2)根据SEL数据找到对应的方法的地址;

3)根据方法的地址调用相应的方法。

4)注意:在这个操作过程中有缓存,第一次的时候是一个一个的找,非常耗性能,之后再用到的时候就直接使用。

关于_cmd:每个方法的内部都有一个_cmd,代表当前方法。

SEL s1 = @selector(test); //手动把test方法包装成SEL类型

[p performSelector:s1]; //响应方法,向对象p发送一个s1消息,从而调用test方法。

十一:类对象的存储细节

1.类对象的存储细节:



[/b]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: