***************************************
多态的概念和条件
1.什么是多态
不同的对象 以自己的方式响应相同名称方法的能力称为多态
体现:父类的指针指向了子类的对象
2.多态的条件
有继承关系 、有方法重写
3.多态的优点: 简化了编程的接口
-------------Animal类的声明和实现>>>>>>>>>>>>>>>
@interface Animal : NSObject
-(void)run;
@end
@implementation Animal
-(void)run{
NSLog(@"动物在跑");
}
-------------Animal子类Dog类的声明和实现>>>>>>>>>>>>>>>
@interface Dog : Animal//有继承关系
-(void)run;
-(void)eat;
@end
@implementation Dog
-(void)run{//有方法重写
NSLog(@"狗在跑");
}
-(void)eat{//多态的使用注意
NSLog(@"狗在吃东西");
}
@end
-------------Animal子类Cat类的声明和实现>>>>>>>>>>>>>>>
@interface Cat : Animal//有继承关系
@end
@implementation Animal
-(void)run{//有方法重写
NSLog(@"猫在爬树");
}
@end
------------->>>>>>>>>>>>>>>
Animal *ani=[Animal new];
[ani run];//动物在跑
Dog *d1=[Dog new];
[Dog run];//狗在跑
Cat *cat =[Cat new];
[cat run];//猫在爬树
-------------使用多态>>>>>>>>>>>>>>>
Animal *a2=[Dog new];//多态的表现形式:父类的指针变量指向了子类
[a2 run];//调用了Dog的run 方法
4.多态的原理
动态绑定 :id类型
5.多态的注意点
1)如果存在多态
-------------多态的使用注意>>>>>>>>>>>>>>>
Animal *a3=[Dog new];
// [a3 eat] //这样子是报错的 因为a3是Animal 类型的 没有 eat 方法
#warning 编译的时候a3是animal类型 运行的时候是 Dog类型(编译的时候看左边 运行的时候看右边)
[(Dog *) a3 eat];//将a3强制转换为Dog 类型的就可以运行了
#warning 这句话体现的并不是多态 而是OC弱语法的特点
Animal *a4 =[Animal new];
[(Dog *) a4 eat];//这种方法是错误 因为a4本身就是Animal对象 没有eat方法 也没法强制转换 或者说是强制转换失败
***************************************
类的本质
Person *p=[Person new];
1.类类型的对象
2.类的本质
其实也是一个对象 Person 也是一个对象 (类对象) 是Class 类型的对象
3.类对象如何获取
1)通过实例对象获取
2)通过类名获取
-------------Dog类的声明和实现>>>>>>>>>>>>>>>
@interface Dog : NSObject
-(void)test;
+(void)test;
@end
@implementation Dog
-(void)test{
NSLog(@"调用对象方法test");
}
+(void)test{
NSLog(@"调用类方法test");
}
@end
-------------获取类对象>>>>>>>>>>>>>>
Dog *d= [Dog new];
Dog *d1= [Dog new];
1)通过实例对象获取
Class c1= [d class];
Class c2= [d1 class];
NSLog(@"%p",c1);
NSLog(@"%p",c2);
2)通过类名获取
Class c3=[dog class];
NSLog(@"%p",c3);
***************************************
类对象的使用(了解即可)
/*
使用类名可以做哪些事情?
1)创建对象
[Person new]
2)调用类方法
[Person test];//test是类方法
*/
1.使用类对象创建实例对象 c1当做Person来使用
Class c1 =[Person class];//获取类对象
Person *p= [c1 new]//1.使用类对象创建实例对象 c1当做Person来使用
#warning 不可以这样写 c1 *p=[c1 new];因为c1本身是一个类对象 放在前边不合理
2.调用类对象
[c1 test];//2.调用类对象 (test是类对象)
***************************************
类对象的存储细节(理解性知识)
***************************************
SEL类型
1.SEL 全称 selector 表示方法的存储位置
SEL其实是对方法的一种包装 将方法包装成一个SEL类型的数据
---------------->>>>>>>>>>>>>
@interface Person : NSObject
-(void) test;
@end
@implementation Person
-(void) test{
NSLog(@"test");
}
@end
---------------->>>>>>>>>>>>>
Person *p=[Person new];
[p test];//这是正常的调用类方法的办法
SEL s1=@selector(test);//手动将test方法包装成SEL类型
[p performSelector:s1]//响应方法 跟[p test]作用相同
***************************************
点语法介绍和使用
1.使用点语法
2.点语法 验证
--------------->>>>>>>>>>>>>>
@interface Person : NSObject
{
//实例变量
NSString *_name;
int _age;
}
//set方法
-(void)setAge:(int)age;
-(void)setName:(NSString *)name;
//get方法
-(int)age;
-(NSString*)name;
@end
@implementation Person
//set方法
-(void)setAge:(int)age{
NSLog(@"调用了set方法");
_age = age;
}
-(void)setName:(NSString *)name{
_name = name;
}
//get方法
-(int)age{
NSLog(@"调用了get方法");
return _age;
}
-(NSString*)name{
return _name;
}
@end
--------------->>>>>>>>>>>>>>
Person *p=[Person new];
点语法:xcode的特性,xcode帮我们做代码替换
//对象.属性名
注意,此时(p.age)并不是直接访问实例变量,
//而是xcode 看到点语法(p.age)后,会帮我们自动替换成
//p.age --替换-->[p setAge:18]
p.age=18;//给age赋值 替换的是 [p setAge:18]
p.name=@"凤姐";//给name 赋值
点语法的本质:调用set get方法
int a = [p age]; //调用get方法
注意,此处p.age是出现在了等号的右侧
实际上,当xcode 看到p.age出现在等号的右侧后,
它会帮我们把p.age ---替换成---> [p age];
***************************************
点语法的使用注意
1.使用陷阱 死循环
2.点语法注意
//点语法的本质是方法的调用,而不是访问成员变量,当使用点语法时,编译器会自动展开成相 应的方法。切记点语法的本质是转换成相应的set和get方法,如果没有set和get方法,则不能使用点语 法。
|
|