1、成员访问类型

private:私有成员,不能被外部函数访问(使用),也不能被子类继承;

protected:保护成员,不能被外部函数访问,可以被子类继承;

public:公有成员,可以被外部函数访问,也可以被子类继承。

OC中,所有的方法(消息),都是公有的。

2、重写(继承的另一部分)

子类可以从父类继承方法,但是有时候父类的方法不适合子类,子类就可以写一个自己的同名方法,覆盖掉父类的同名方法,叫做重写。

重写的时候,在子类的.h中不必重新声明,直接在.m中写实现就可以。

 //父类声明文件
#import <Foundation/Foundation.h>
@interface Father : NSObject
-(void)run;
-(void)jump;
@end //父类实现文件
#import "Father.h"
@implementation Father
-(void)run{
NSLog(@"he is running!");
return;
}
-(void)jump{
NSLog(@"father can jump 1.2m");
}
@end
 //子类声明文件
#import "Father.h" @interface Son : Father @end //子类实现文件
#import "Son.h" @implementation Son
-(void)jump{
NSLog(@"he can jump 0.6m");
}
@end

其中,子类重写父类的jump方法,不需要重新声明。

同一个方法,不同的实现,称为多态。重写是多态的一种。

继承的好处:

  1)创建大量的相似类的时候,可以节省工作量。

  2)使用框架中的类,或已经写好的类,继承该类,生成一个派生类,比原类更好用。

注意:NSString、NSArray、NSDictionary都是不能够继承的。

3、虚方法

OC的方法都是虚方法

  1)父类的指针可以指向子类的对象

 Son * son = [[Son alloc] init];
Father * p = son;

上面p和son都指向子类的对象;调用方法时,不看指针,看对象,对象的地址指向什么对象,就调用什么方法,称为虚方法。

  2)调用方法时,不看指针看对象,这样的方法叫做虚方法。虚方法的好处:可以描述不同事物被相同事件触发,产生不同的响应(结果)。体会下面的例子

动物的父类声明与实现

 //动物类声明
#import <Foundation/Foundation.h>
@interface Animal : NSObject
-(void)beBeaten;
@end
 //动物类实现
#import "Animal.h"
@implementation Animal
-(void)beBeaten{
return; //该方法需要子类实现,所以父类不需要写任何实现代码
}
@end

子类(狗)的声明与实现

 #import "Animal.h"

 @interface Dog : Animal

 @end
 #import "Dog.h"

 @implementation Dog
//该方法在父类已经声明,所以子类不需要重复声明
-(void)beBeaten{
NSLog(@"wang,wang...");
}
@end

子类(猫)的声明与实现

 #import "Animal.h"

 @interface Cat : Animal

 @end
 #import "Cat.h"

 @implementation Cat
//该方法在父类已经声明,所以子类不需要重复声明
-(void)beBeaten{
NSLog(@"miao,miao...");
}
@end

人类的声明与实现

 #import <Foundation/Foundation.h>
#import "Animal.h"
@interface Human : NSObject
//调用该方法,此处只写一个父类的指针就可以,这是利用了父类的虚方法;
//不然,需要写多个方法实现:beatAnimal:(Dog *)dog;beatAnimal:(Cat *)cat;打不同的动物需要传不同的对象,所以利用虚方法、父类的指针是非常方便的
-(void)beatAnimal:(Animal*)animal;
@end
 #import "Human.h"

 @implementation Human
-(void)beatAnimal:(id)animal{
NSLog(@"Human beat the %@",[animal class]);
[animal beBeaten];
}
@end
 Dog * dog = [[Dog alloc] init];
Cat * cat = [[Cat alloc] init];
Human * xiaoming = [[Human alloc] init];
[xiaoming beatAnimal:dog];
[xiaoming beatAnimal:cat];
//输出:
//2013-09-29 15:51:00.604 OC[752:303] Human beat the Dog
//2013-09-29 15:51:00.619 OC[752:303] wang,wang...
//2013-09-29 15:51:00.620 OC[752:303] Human beat the Cat
//2013-09-29 15:51:00.621 OC[752:303] miao,miao...

结题!!!

OC继承的更多相关文章

  1. OC继承以及实例变量修饰符

    这里基本上跟java一样 所以就简单写几点要注意的: 1)OC与java一样都只支持单继承可以多层继承(java单继承多实现) 2) OC中的实例变量修饰符前要加 @ 例如 @private 例如下面 ...

  2. OC——继承

    继承的其中一个很重要的目的是为了实现多态.我们现在先来看看OC的继承. 一.继承 父类: 头文件 // // Peason.h // 01-继承和多态 // // Created by zhangji ...

  3. OC 继承

    一.基本概念 程序的世界和人类的“对象”世界在思想上是没有设么区别的,富二代继承了父母,自然就拥有了父母拥有的所有资源,子类继承了父类同样就拥有了父类所有的方法和属性(成员变量). 在这里动物是猫类和 ...

  4. iOS学习11之OC继承

    面向对象的三大特性:封装,继承,多态. 1.继承 继承既能保证类的完整,又能简化代码. 把公共的⽅法和实例变量写在⽗类⾥,⼦类只需要写⾃⼰独有的实例变量和⽅法即可. 继承是⾯向对象三⼤特性之⼀,合理的 ...

  5. OC 继承子类对象调用方法机制 子类对象访问父类中的实例变量

    在继承中,子类对象如何调用到正确方法的机制 每一个Objective - C对象都有一个隐藏的指针指向类的代码,当向一个对象发送消息的时候,当前的对象会首先在当前类里去查找相应的方法,如果找到的话,直 ...

  6. 关于 self 和 super 在oc 中 的疑惑 与 分析

    关于 self 和 super 在oc 中 的疑惑 与 分析   面试一定都是很注重 基础的,不管高级还是初级. 虽然基础好跟基础不好都可以写 代码,网上那么多资料.  区分高低也就是研究的深度和广度 ...

  7. OC补充

    OC 1成员变量默认初始化为0 2匿名对象:就是没有名字的对象,比如:(不建议使用) 3 [Car new]->speed = 300; [[Car new] run];(运行结果speed为0 ...

  8. OC基础知识总结 分类: ios学习 OC 2015-06-26 17:58 58人阅读 评论(0) 收藏

    //OC: Objective-C, 面向对象的C语言 //OC与C的区别 //1.OC是C的超集, C语言的所有语法都可以在OC中使用 //2.OC是面向对象 //3.OC是一门运行时语言 //4. ...

  9. 关于self和super在oc中的疑惑与分析 (self= [super init])

    这个问题貌似很初级,但很容易让人忽略,me too .直到在一次面试时被问到,稀里糊涂的回答了下.实在惭愧, 面试一定都是很注重 基础的,不管高级还是初级. 虽然基础好跟基础不好都可以写代码,网上那么 ...

随机推荐

  1. java1.8中ConcurrentHashMap

    java1.8中的ConcurrentHashMap做了非常大的改动,整个数据结构都发生了变化,已经不存在segment了.所以要好好重新查看下源码.这篇博客是逐步更行的,看一点写一点. 首先看一个很 ...

  2. leetcode:N-Queens 问题

    一.N-QueensII class Solution { public: int totalNQueens(int n) { ; vector<); dfs(,n,total,v); retu ...

  3. assert函数的用法

    assert这个函数在php语言中是用来判断一个表达式是否成立.返回true or false; 例如: <?php $s = 123; assert("is_int($s)" ...

  4. linux 下vim的使用(必看)

    vi与vimvi编辑器是所有Unix及Linux系统下标准的编辑器,他就相当于windows系统中的记事本一样,它的强大不逊色于任何最新的文本编辑器.他是我们使用Linux系统不能缺少的工具.由于对U ...

  5. Hudson-ci/Using Hudson/Installing Hudson/Installing Hudson RPM--官方文档

    < Hudson-ci‎ | Using Hudson‎ | Installing Hudson(Redirected from Hudson-ci/Installing Hudson RPM) ...

  6. Linux下如何查看版本信息(转)

    Linux下如何查看版本信息, 包括位数.版本信息以及CPU内核信息.CPU具体型号等等,整个CPU信息一目了然.   1.# uname -a   (Linux查看版本当前操作系统内核信息)   L ...

  7. [SQL Server] 无法连接到本地数据库

    打开SQL Server配置管理器 启用下图两个协议 打开SQL Server服务 这一步可能出现这种情况: 故障原因是,安装Visual Studio 2012的时候,自动安装“Microsoft ...

  8. J2EE的体系架构

    J2EE是Java2平台企业版(Java 2 Platform,Enterprise Edition),它的核心是一组技术规范与指南,提供基于组件的方式来设计.开发.组装和部署企业应用.J2EE使用多 ...

  9. excel 工作表如何插入当前日期时间

    在EXCEL表格中,插入当前的日期或是插入当前的时间:我们都可以用快捷键或时间函数来实现 插入当前日期 快捷键方法: 比如,显示日期的单元格为A1单元格: 今天是2018年6月8日: 鼠标点一下A1单 ...

  10. 如鹏网学习笔记(七)HTML基础

    HTML笔记 一.HTML简介 1,HTML (Hyper Text Mark-up Language) 超文本标记语言,是一种编程语言,也可以说是一种标准.规范. 2,HTML提供了一系列标记(标签 ...