前言:

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. Echarts的基本用法

    首先需要到导入echatrs.js文件 <script src="dist/echarts.js"></script> 路径配置 require.confi ...

  2. java 多线程—— 线程让步

    java 多线程 目录: Java 多线程——基础知识 Java 多线程 —— synchronized关键字 java 多线程——一个定时调度的例子 java 多线程——quartz 定时调度的例子 ...

  3. .gitignore

    # Xcode # build/ *.pbxuser !default.pbxuser *.mode1v3 !default.mode1v3 *.mode2v3 !default.mode2v3 *. ...

  4. Spring 整合 Hibernate

    Spring 整合 Hibernate •Spring 支持大多数流行的 ORM 框架, 包括 Hibernate JDO, TopLink, Ibatis 和 JPA. •Spring 对这些 OR ...

  5. 1、android源代码下载及目录分析,和eclipser的跟踪

    1.在eclipse中跟踪源代码:假如对mainactivity.java里面的activity按Ctrl+鼠标左键(前提已经导入android源代码:方法1:在项目点击右键,然后找到properti ...

  6. python 的 *args 和 **kwargs

    Python支持可变参数,通过*args和**kwargs来指定,示例如下: def test_kwargs(first, *args, **kwargs):    print 'Required a ...

  7. springmvc学习第三天

    利用spring mvc 实现crud 1.导入jar包 commons-logging-1.2.jarjstl.jarspring-aop-4.1.6.RELEASE.jarspring-beans ...

  8. Wireshark找不到网络接口问题

    Wireshark找不到网络接口问题 在运行Wireshark工具抓包时,需要有管理员用户权限.如果是普通用户启动的话,将会提示找不到网络接口.

  9. SDK、MFC、QT界面生成的机制

    1.SDK进行界面设计的机制 (1)设计窗口类 (2)注册窗口类 (3)创建窗口 (4)显示及更新窗口 (5)消息循环,操作系统接收到应用程序的窗口消息,将消息投递到队列中,通过GetMessage( ...

  10. source insight 相对路径

    source insight项目 在移动到另外一个地方时,会因为之前是绝对路径而导致,项目中的文件都不可用,需要重新把这些文件添加一遍. 这是个令人讨厌的事情. 解决办法为创建项目时设定为绝对路径.方 ...