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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 逗你玩儿LLY 中级黑马   /  2015-10-14 16:47  /  771 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文


11.多态

  1.什么是多态?
   
     不同的对象以自己的方式响应同一个指令的能力.

  2.多态的条件的是什么?
   
     1)要存在继承关系
     2)存在方法的重写(必须有同名方法)
     3)父类的指针必须指向子类的对象


  3.多态的实现

     Dog 继承自 Animal   Animal Dog类的父类

     Animal *ani = [Animal new];  //正常写法

     Animal *ani2 = [Dog new];    //父类指针指向了子类对象,这就是多态.

动态绑定:   动态类型能使程序直到执行时才确定对象所属类型   动态类型绑定能使程序直到执行时才确定要对对象调用的实际方法



//动态类型,一个对象的类型不是编译的时候确定的,而是运行的时候确定
//(也就是说,一个对象,只有在运行的时候才能确定自己的类型,这就是动态类型)

  4.多态的注意点:







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







12、类的本质




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

类对象
*类对象再程序运行时一直存在。
*类对象是一种数据结构,存储类的基本信息:类大小,类名称,类的版本以及消息与方法 的映射表等
*类对象所保存的信息在程序编译时确定,在第一次使用该类的时候被加载到内存中。
*类对象代表类,class代表类对象,类方法属于类对象
*如果消息的接收者是类名,则类名代表类对象
*运行时,所有类的实例对象都由类对象生成,类对象会把实例的isa的值修改成自己的地 址,每个实例的isa都指向该实例的类对象,
*从类对象里可以知道父类信息、可以响应的方法等
*类对象只能使用类方法,不能用实例方法




        //创建对象(实例对象)
        Car *car = [Car new];   //car 实例对象
                                //Car也是一个对象,类对象,是Class类型的
        //类对象的获取?
        
        //1)通过类名来获取类对象
        Class c1 = [Car class];  //c1是一个类对象   == Car
        NSLog(@"c1 = %@,%p",c1,c1);
        
        
        //2)通过实例对象名来获取类对象
        Class c2 = [car class];
        NSLog(@"c2 = %@,%p",c2,c2);  //c2 == Car



13.SEL 类型

SEL 是一种类型
选择器类型: 可以把一个方法包装成此类型 通过SEL类型,可以找到 在代码区的方法的地址
SEL s1 =@selector(eat); //把eat方法,包装成SEL类型了




[p performSelector:s1]; //发送s1   向 p对象发送 s1,对比p方法中与s1相同的地址并调用

1 个回复

倒序浏览
很好!  谢谢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马