A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始


***************************************
多态的概念和条件

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方法,则不能使用点语 法。


0 个回复

您需要登录后才可以回帖 登录 | 加入黑马