前言:

oc中的指针类型变量有两个:一个是编译时类型,一个是运行时类型,编译时类型由声明该变量是使用的类型决定,运行时类型由实际赋给该变量的对象决定。如果编译时类型和运行时类型不一致,就有可能出现多态。

正文:

新建一个CHPerson类

 @interface CHPerson : NSObject
-(void)eat;
-(void)play;
@end
---------------------------------------------------------
#import "CHPerson.h" @implementation CHPerson
-(void)eat{
NSLog(@"----父类的吃");
}
-(void)play{
NSLog(@"-----父类的玩");
}
@end

新建一个继承于CHPerson的CHchina类

 #import "CHPerson.h"

 @interface CHChina : CHPerson
-(void)playgame;
@end ---------------------------------------------------- #import "CHChina.h" @implementation CHChina
-(void)eat{
NSLog(@"=======子类的吃");
}
-(void)playgame{
NSLog(@"玩游戏");
}
@end

调用方法:

 #import "ViewController.h"
#import "CHChina.h"
@interface ViewController () @end @implementation ViewController - (void)viewDidLoad {
[super viewDidLoad];
// 下面编译时类型和运行时类型完全一样,因此不存在多态
CHPerson *person = [[CHPerson alloc]init];
[person eat]; // 下面编译时类型和运行时类型完全一样,因此不存在多态
CHChina *china = [[CHChina alloc]init];
[china eat]; // 下面编译时类型和运行时类型不一样,因此发生多态
CHPerson *perch = [[CHChina alloc]init];
// 调用从父类继承的play方法
[perch play];
// 调用子类重写eat方法
[perch eat]; // 因为perch的编译时类型是CHPerson,但CHPerson没有playgame方法,所以编译时会报错
// [perch playgame];
// 但可以将任何类型的指针变量赋值给id类型的变量
id allperch = perch;//下面会解释为何这样做?
[allperch playgame]; }

结果:

 -- ::03.705 多态[:] ----父类的吃 13行代码结果
-- ::03.705 多态[:] =======子类的吃
-- ::03.706 多态[:] -----父类的玩
-- ::03.706 多态[:] =======子类的吃 24行代码结果
-- ::03.706 多态[:] 玩游戏
  • 指针perch变量比较特殊,编译是CHPerson类型,运行时是CHChina类型,所以实际上执行的是CHChina类中覆盖后的eat方法。指针变量在编译阶段只能调用编译时所具有的方法,但运行时则执行其运行时类型所具有的方法
  • 子类其实是一种特殊的父类,oc中允许把一个子类对象直接赋值给一个父类指针变量,不需要任何变量。
  • 当把一个子类对象直接赋值给一个父类指针变量时( CHPerson *perch = [[CHChina alloc]init];),编译时和运行时类型不一样,运行时调用该指针变量的方法时,其方法子类方法而不是父类的方法,这就出现了相同类型的变量调用同一个方法时呈现出多种不同行为特征。

补充(id):oc中提供了一个id类型,这个id类型可以代表所有对象的类型。就是说,任意类型的对象都可以赋值给id类型变量。

当通过id类型变量来调用方法时,oc将会执行动态绑定,动态绑定,是指oc将会跟踪对象所属类,它会在运行时判断该对象所属类,并在运行时确定需要动态调用的方法,而不是在编译时确定要调用的方法。如上面,程序会在运行时动态检测该变量所指的对象的实际类型为CHChina,所以会动态绑定到执行CHChina的eat方法。

OC基础—多态(超级简单)的更多相关文章

  1. JS基础(超级简单)

    1     JS基础(超级简单) 1.1 数据类型 1.1.1   基本类型: 1)        Number:特别注意:NaN的检测方法:Nan!=NaN;或者使用isNaN方法 2)       ...

  2. OC基础--多态 及 三特性小练习

    什么是多态 什么是多态: 多态就是某一类事物的多种形态 猫: 猫-->动物 狗: 狗-->动物 男人 : 男人 -->人 -->动物 女人 : 女人 -->人 --> ...

  3. java基础(1-50)-------->超级简单,不信你不会!!!

    1:java中的保留字:const&goto; 2:&和&&都可以做逻辑运算符,即运算符两边的表达式都为true,结果才为true,一方为false,则结果为false ...

  4. OC基础6:多态、动态类型和动态绑定

    "OC基础"这个分类的文章是我在自学Stephen G.Kochan的<Objective-C程序设计第6版>过程中的笔记. 1.关于SEL类型的数据: (1).SEL ...

  5. 五.OC基础--1.多态,2.类对象,3.点语法,4.@property&@synthesize,5.动态类型,内省(判断对象是否遵循特定的协议,以及是否可以响应特定的消息)

    五.OC基础--1.多态, 1. 多态概念,定义:多态就是某一类事物的多种形态: 表现形式: Animal *ani = [Dog new]; 多态条件:1.有继承关系 2.有方法的重写 2.多态代码 ...

  6. OC基础 类的三大特性

    OC基础  类的三大特性 OC的类和JAVA一样,都有三大特性:继承,封装,多态,那么我们就来看一下OC中类的三大特性. 1.继承 继承的特点: (1)子类从父类继承了属性和方法. (2)子类独有的属 ...

  7. OC面向对象—多态

    OC面向对象—多态 一.基本概念 多态是基于继承的基础之上的,多态可以使得父类的指针指向子类的对象.如果函数或参数中使用的是父类类型,可以传入父类.子类对象,但是父类类型的变量不能直接调用子类特有的方 ...

  8. OC基础笔记目录

    OC基础(1) Objective-C简介 OC和C对比 第一个OC程序 面向对象思想 OC基础(2) 类与对象 类的设计 第一个OC类 对象方法的声明和实现 类方法的声明和实现 OC基础(3) 对象 ...

  9. OC基础 可变数组与不可变数组的使用

    OC基础 可变数组与不可变数组的使用 1.不可变数组 1.1不可变数组的创建 //实例方法 NSArray *array = [[NSArray alloc] initWithObjects:&quo ...

随机推荐

  1. Java简介

    命令行输入参数不是在代码中设置输入的,而是这样做:选中你java项目中的java---右击----Run As---Run Configurations---Arguments----填入参数(多个参 ...

  2. Python相对、绝对导入浅析

    这篇文章从另外一个不同的视角来分析一下Python的import机制,主要的目的是为了搞懂import中absolute.relative import遇到的几个报错. 这里不同的视角是指从Pytho ...

  3. mysql查询结果输出到文件

    mysql查询结果导出/输出/写入到文件 方法一: 直接执行命令: mysql> select count(1) from table  into outfile '/tmp/test.xls' ...

  4. 模拟系列(一)——数字电路

    要求 简要模拟数字电路的运行过程,及电位(简化为L和H),用C# WinForm实现. 思路 逻辑部分 电路是一种图结构,基于C#的特性,设计Node类(结点)和Wire类(连线),且为泛型. 由于电 ...

  5. cmake gcc等安装备案

    cmake安装,参照 http://www.cnblogs.com/voyagflyer/p/5323748.html cmake2.8以上 安装后的是/usr/local/bin/cmake -ve ...

  6. google应用商店的解决

    { "enabled_plugins": [ "SimpleReloadPlugin", "SimpleRefresh" ] } git c ...

  7. html中input文本框,初始里边有文字提示,当点击时,文字消失,怎么设置?

    使用onfocus事件检查当前值,如果是默认值,就将value属性置空.如:<input type="text" value="请输入内容" onfocu ...

  8. 解决SQLite database is locked

    前些时候,同事在站点服务端使用SQlite存储一些临时数据,但是在多人并发的时候Sqlite会抛出异常:The database file is locked , database is locked ...

  9. iOS开发拓展篇—UIDynamic(重力行为+碰撞检测)

    iOS开发拓展篇—UIDynamic(重力行为+碰撞检测) 一.重力行为 说明:给定重力方向.加速度,让物体朝着重力方向掉落 1.方法 (1)UIGravityBehavior的初始化 - (inst ...

  10. ubuntu 下创建桌面快捷方式

    1)新建文件eclipse.desktop,命令如下: sudo vim /usr/share/applications/eclipse.desktop 2)在新建文件中添加如下内容并保存: [Des ...