OC基础—多态(超级简单)

前言:

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

正文:

新建一个CHPerson类

 1 @interface CHPerson : NSObject
 2 -(void)eat;
 3 -(void)play;
 4 @end
 5 ---------------------------------------------------------
 6 #import "CHPerson.h"
 7
 8 @implementation CHPerson
 9 -(void)eat{
10     NSLog(@"----父类的吃");
11 }
12 -(void)play{
13     NSLog(@"-----父类的玩");
14 }
15 @end

新建一个继承于CHPerson的CHchina类

 1 #import "CHPerson.h"
 2
 3 @interface CHChina : CHPerson
 4 -(void)playgame;
 5 @end
 6
 7 ----------------------------------------------------
 8
 9 #import "CHChina.h"
10
11 @implementation CHChina
12 -(void)eat{
13     NSLog(@"=======子类的吃");
14 }
15 -(void)playgame{
16     NSLog(@"玩游戏");
17 }
18 @end

调用方法:

 1 #import "ViewController.h"
 2 #import "CHChina.h"
 3 @interface ViewController ()
 4
 5 @end
 6
 7 @implementation ViewController
 8
 9 - (void)viewDidLoad {
10     [super viewDidLoad];
11     //    下面编译时类型和运行时类型完全一样,因此不存在多态
12     CHPerson *person = [[CHPerson alloc]init];
13     [person eat];
14
15 //    下面编译时类型和运行时类型完全一样,因此不存在多态
16     CHChina *china = [[CHChina alloc]init];
17     [china eat];
18
19 //    下面编译时类型和运行时类型不一样,因此发生多态
20     CHPerson *perch = [[CHChina alloc]init];
21 //    调用从父类继承的play方法
22     [perch play];
23 //    调用子类重写eat方法
24     [perch eat];
25
26 //    因为perch的编译时类型是CHPerson,但CHPerson没有playgame方法,所以编译时会报错
27 //    [perch playgame];
28 //    但可以将任何类型的指针变量赋值给id类型的变量
29     id allperch = perch;//下面会解释为何这样做?
30     [allperch playgame];
31
32 }

结果:

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

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

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

时间: 2024-10-27 00:06:44

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

JS基础(超级简单)

1     JS基础(超级简单) 1.1 数据类型 1.1.1   基本类型: 1)        Number:特别注意:NaN的检测方法:Nan!=NaN;或者使用isNaN方法 2)        string 3)        boolean 4)        null 5)        undefined 1.1.2   复杂类型 object:date,array,function 1.2 变量 var 变量名=值 变量的作用域:1.全局:以页面为单位.2局部:以函数为单位.

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

什么是多态 什么是多态: 多态就是某一类事物的多种形态 猫: 猫-->动物 狗: 狗-->动物 男人 : 男人 -->人 -->动物 女人 : 女人 -->人 -->动物 多态表示不同的对象可以执行相同的动作, 但是通过他们自己的实现代码来执行 程序中的多态:父类指针指向子类对象 多态的条件 有继承关系 子类重写父类方法 父类指针指向子类对象           狗 *g = [狗 new];           动物 *a = [狗 new];           猫

超级简单版多态计算器

个人笔记学习黑马四期 一.编写一个操作父类 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 多态计算器 { /// <summary> /// 计算父类 /// </summary> class Operation { public int NumA { get; set; } p

oc基础知识(转)

1.项目经验 2.基础问题 3.指南认识 4.解决思路 ios开发三大块: 1.Oc基础 2.CocoaTouch框架 3.Xcode使用 -------------------- CocoaTouch Media Core Services Core OS -------------------- System Framework OC的类声明,定义域 OC关键字定义为  @class O-C特有的语句for(..in ..)迭代循环,其他的条件和循环语句和c一样 OC对面向对象的概述 (1)

OC基础 类的三大特性

OC基础  类的三大特性 OC的类和JAVA一样,都有三大特性:继承,封装,多态,那么我们就来看一下OC中类的三大特性. 1.继承 继承的特点: (1)子类从父类继承了属性和方法. (2)子类独有的属性和方法不能被父类使用. (3)子类独有的属性和方法,不能够在子类之间互相使用. (4)子类能够重写父类的方法,子类调用该方法时:首先调用子类的方法,如果子类没有该方法,就调用父类的该方法. (5)子类对象指针可以转换成父类对象指针,但是父类对象指针不能够转换成子类对象指针. 三种权限变量的继承:

OC基础01

搜索 "==>" 寻找标记 OC基础总结: Objective-C具有相当多的动态特征,如: " 动态类型 , 动态绑定 , 动态加载" ==> copy mutableCopy 浅复制: 在复制操作中,对于被复制的对象的每一层复制都是指针复制. 深复制: 在复制操作中,对于被复制的对象至少有一层是对象复制 完全复制: 在复制操作中,对于被复制的对象的每一层都是对象复制. 一般来讲: 浅复制复制引用对象的指针 深复制 复制引用对象的内容 retain &

iOS开发OC基础:OC基础概念总结,OC面向对象的思想

一.什么是OOP: OOP(Object Oriented Programming):面向对象编程 二.面向对象和面向过程的区别: 面向过程编程:分析解决问题的步骤,实现函数,依次使用面向对象编程:分解问题组成的对象,协调对象间的联系和通信,解决问题. 面向过程是以事件为中心,关心的是完成这个事件的详细步骤:面向对象是以事物为中心,关心的是事物应该具备的功能,而完成一个事件只是事物所有功能里面的一个小功能(以过程为中心,以对象为中心) 三.类和对象 对象定义了解决问题的步骤中的行为,不刻意完成一

iOS开发OC基础:OC属性的一些概念和基本使用

一.属性简介 //属性是OC2.0之后新出的一种语法,能让我们快速的生成setter以及getter方法,大大简化代码 二.如何定义一个属性 //@property 属性关键字,用来定义属性 //NSString * 属性的类型 //name 属性的名字. //@property 只是生成的setter以及getter方法的声明.@property NSString *name; 三.属性的使用注意事项//如果在.m文件中我们自己实现了setter以及getter方法,则编译器就不会再帮我们生成

OC基础(21)

Foundation框架介绍 NSString基本概念 字符串读写 字符串比较 字符串搜索 字符串截取 字符串替换 字符串与路径 字符串与基本数据类型转换 *:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } a { color: #4183C4; } a.absent { color: #cc0000; } a.anchor { display: bloc