前言:

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. node.js基础 1之 URL网址解析的好帮手

    URL和URI的区别: URL是统一资源定位符 URI是统一资源标识符 URL是URI的子集(URL一定是URI,但URI不一定是URL) node中的URL中的url.parse protocol: ...

  2. Python内置的字符串处理函数整理

    Python内置的字符串处理函数整理 作者: 字体:[增加 减小] 类型:转载 时间:2013-01-29我要评论 Python内置的字符串处理函数整理,收集常用的Python 内置的各种字符串处理 ...

  3. PL/sql语法单元

    1.字符集 PL/SQL的字符集包括: 所有大小写字母:包括A~Z和a~z. 数字:包括0~9. 空白字符:包括制表符.空格和回车符 其他常用英文符号 2.标识符 标识符用于定义PL/sql变量.常量 ...

  4. LG1268树的重量

    #include<bits/stdc++.h> using namespace std; #define N 35 #define INF 1e9 int dis[N][N],n,len, ...

  5. c# windows编程控件学习-2

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  6. 从0到1---“保多多”APP的开发(一)

    2015年8月份,我正式接手了公司保多多APP的开发(和另一个同事一起). 我之前并没有过从0开始创建一款APP,这次能有这样的机会,实在让我感到兴奋.因为我相信,作为这款APP的主要开发人员,在这一 ...

  7. 作业七:团队项目——Alpha版本冲刺阶段 001

    今天进展:准备开发环境,安装软件. 今天安排:因为软件过于庞大,所以我们第一天都在按软件,原本计划第一天要设计框架,但因为软件问题.所以我们决定留到第二天.

  8. Sql 注意点

    1. Set.Select赋值 使用SELECT语句来替代SET命令的主要优点是:可以在一个操作内同时给多个变量赋值.执行下面的SELECT语句,通过SELECT语句赋值的变量就可以用于任何操作了. ...

  9. 利用MVVM设计快速开发个人中心、设置等模块

    我们在做iOS开发过程中,静态页面的开发比开发动态页面更让我们开发者抓狂.因为动态页面通常是一个页面一种cell样式,作为开发者只需要专注于定制好一种样式之后,就可以使用数据填充出较好的界面.而静态c ...

  10. 使用python-openCV对摄像头捕捉的镜头进行二值化并打上文字

    用CaptureFromCAM函数对图像进行提取: capture = cv.CaptureFromCAM(0) 读取直接的视频文件只需将语句改变为: capture = cv.VideoCaptur ...