OC基础  类的三大特性

OC的类和JAVA一样,都有三大特性:继承,封装,多态,那么我们就来看一下OC中类的三大特性。

1.继承

继承的特点:

(1)子类从父类继承了属性和方法。

(2)子类独有的属性和方法不能被父类使用。

(3)子类独有的属性和方法,不能够在子类之间互相使用。

(4)子类能够重写父类的方法,子类调用该方法时:首先调用子类的方法,如果子类没有该方法,就调用父类的该方法。

(5)子类对象指针可以转换成父类对象指针,但是父类对象指针不能够转换成子类对象指针。

三种权限变量的继承:

(1)public和protected修饰的变量可以被子类继承。

(2)private修饰的变量不可以被子类继承。

(3)继承的属性,如果要在子类里面修改,只能使用 "self.属性名",不能使用 "_属性名"

例子:

Father类,Father.h文件:

  1. #import <Foundation/Foundation.h>
  2.  
  3. @interface Father : NSObject
  4.  
  5. @property (nonatomic,strong) NSString *name;
  6.  
  7. @property (nonatomic) int age;
  8.  
  9. -(id)initWithName:(NSString *)name andAge:(int)age;
  10.  
  11. -(void)speakChinese;
  12.  
  13. -(void)printf;
  14.  
  15. @end

Father.m文件:

  1. #import "Father.h"
  2.  
  3. @implementation Father
  4.  
  5. -(id)initWithName:(NSString *)name andAge:(int)age
  6. {
  7. self = [super init];
  8. if(self)
  9. {
  10. _name = name;
  11. self.age = age;
  12. }
  13. return self;
  14. }
  15.  
  16. -(void)speakChinese
  17. {
  18. NSLog(@"我会说中文");
  19. }
  20.  
  21. -(void)printf
  22. {
  23. NSLog(@"我叫%@,我%d岁",_name,_age);
  24. }
  25.  
  26. @end

Son1类,Son1.h文件:

  1. #import "Father.h"
  2.  
  3. @interface Son1 : Father
  4.  
  5. @property (nonatomic) int score;
  6.  
  7. -(void)speakEnglish;
  8.  
  9. @end

Son1.m文件:

  1. #import "Son1.h"
  2.  
  3. @implementation Son1
  4.  
  5. -(void)speakEnglish
  6. {
  7. NSLog(@"我会说英文");
  8. }
  9.  
  10. -(void)printf
  11. {
  12. NSLog(@"%@,%d,%d",self.name,self.age,self.score);
  13. }
  14.  
  15. @end

Son2类,Son2.h文件:

  1. #import "Father.h"
  2.  
  3. @interface Son2 : Father
  4.  
  5. @property (nonatomic) int money;
  6.  
  7. -(void)speakFrench;
  8.  
  9. @end

Son2.m文件:

  1. #import "Son2.h"
  2.  
  3. @implementation Son2
  4.  
  5. -(void)speakFrench
  6. {
  7. NSLog(@"我会说法语,我很屌!");
  8. }
  9.  
  10. @end

main.m中使用:

  1. #import <Foundation/Foundation.h>
  2. #import "Son1.h"
  3. #import "Father.h"
  4. #import "Son2.h"
  5.  
  6. int main(int argc, const char * argv[])
  7. {
  8.  
  9. @autoreleasepool {
  10.  
  11. // insert code here...
  12.  
  13. Father *fa = [[Father alloc] initWithName:@"王老大" andAge:];
  14. NSLog(@"%@%d",fa.name,fa.age);
  15.  
  16. [fa speakChinese];
  17. [fa printf];
  18.  
  19. Son1 *son1 = [[Son1 alloc] initWithName:@"王小三" andAge:];
  20. NSLog(@"%@%d,%d",son1.name,son1.age,son1.score);
  21.  
  22. [son1 speakChinese];
  23. [son1 speakEnglish];
  24. [son1 printf];
  25.  
  26. Son2 *son2 = [[Son2 alloc] initWithName:@"王小二" andAge:];
  27.  
  28. [son2 speakChinese];
  29. [son2 speakFrench];
  30. [son2 printf];
  31.  
  32. Father *fa2 = (Father *)son1;
  33. [fa2 speakChinese];
  34.  
  35. Son1 *son11 = (Son1 *)fa;
  36. [son11 speakEnglish];
  37.  
  38. }
  39. return ;
  40. }

2.封装

封装:隐藏内部实现,稳定外部接口。

封装就是定义类,定义属性和定义方法。

然而类封装了实例变量和方法,属性则是封装的setter和getter方法

那么封装带来的好处:让我们使用更加简单 ,变量更加安全 ,并且可以隐藏内部实现细节 ,充分的提升了开发速度。

例子:

Student类,Student.h文件:

  1. #import <Foundation/Foundation.h>
  2.  
  3. @interface Student : NSObject
  4. {
  5. NSString *_name;
  6. NSString *_nickName;
  7. }
  8.  
  9. //@property定义属性
  10. //1,它给该类声明了一个属性名+下划线的变量
  11. //2,它给该类声明了一个getter方法和一个setter方法
  12.  
  13. //修饰符
  14. //atomic和nonatomic
  15. //原子性和非原子性,atomic线程安全,nonatomic线程不安全
  16. //一般情况下使用nonatomic
  17.  
  18. //setter修饰符指定赋值时调用哪个方法来实现setter
  19. //setter修饰符指定读取值时调用哪个方法来实现getter
  20. @property (nonatomic,setter = setNickName:,getter = nickName) NSString *nickName;
  21.  
  22. //修饰符
  23. //assign用来修饰基本类的
  24. //strong或者retain是用来修饰对象指针的
  25. //readonly只读:只声明和实现getter,不声明和实现setter方法
  26. //readwrite可读写:声明和实现了getter和setter,默认就是readwrite
  27. @property (assign,readonly) int age;
  28. @property (retain,readwrite) NSString *secondName;
  29.  
  30. -(void)setName:(NSString *)name;
  31. -(NSString *)getName;
  32. -(void)setaaa:(NSString *)aaa;
  33.  
  34. @end

3.多态

多态性(polymorphism):允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。也就是说:允许将子类类型的指针赋值给父类类型的指针。

不同对象对同一消息的不同响应,子类可以重写父类的方法,多态就是允许方法重名,参数或返回值可以是父类型传入或返回。

多态的特点:

(1)父类类型的指针指向子类对象。

(2)如果函数方法参数中使用的是父类类型,则可以传入父类和子类对象,而不用再去定义多个函数来和相应的类进行匹配了。

(3)父类类型的变量不能直接调用子类特有的方法,如果必须要调用,则必须强制转换为子类特有的方法。

例子:

Animal类,Animal.h文件:

  1. #import <Foundation/Foundation.h>
  2.  
  3. @interface Animal : NSObject
  4.  
  5. - (void)name;
  6.  
  7. @end

Animal.m文件:

  1. #import "Animal.h"
  2.  
  3. @implementation Animal
  4.  
  5. - (void)name {
  6. NSLog(@"动物");
  7. }
  8. @end

Cat继承Animal,Cat.h文件:

  1. #import "Animal.h"
  2.  
  3. @interface Cat : Animal
  4.  
  5. - (void)name;
  6.  
  7. @end

Cat.m文件:

  1. #import "Cat.h"
  2.  
  3. @implementation Cat
  4.  
  5. //重写方法
  6. - (void)name {
  7. NSLog(@"猫");
  8. }
  9.  
  10. @end

main.m中使用:

  1. #import <Foundation/Foundation.h>
  2. #import "Animal.h"
  3. #import "Cat.h"
  4.  
  5. int main(int argc, const char * argv[])
  6. {
  7.  
  8. @autoreleasepool {
  9.  
  10. Animal *animal = [[Animal alloc] init];
  11. [animal name];
  12.  
  13. Cat *cat1 = [[Cat alloc] init];
  14. [cat1 name];
  15.  
  16. //这里会体现多态的用法:动态监控调用哪个方法
  17. Animal *cat2= [[Cat alloc] init];
  18. [cat2 name];
  19.  
  20. }
  21. return ;
  22. }

OC基础 类的三大特性的更多相关文章

  1. (转载)OC学习篇之---类的三大特性:封装,继承,多态

    之前的一片文章介绍了OC中类的初始化方法和点语法的使用,今天来继续学习OC中的类的三大特性,我们在学习Java的时候都知道,类有三大特性:继承,封装,多态,这个也是介绍类的时候,必须提到的话题,那么今 ...

  2. OC学习篇之---类的三大特性(封装,继承,多态)

    之前的一片文章介绍了OC中类的初始化方法和点语法的使用:http://blog.csdn.net/jiangwei0910410003/article/details/41683873,今天来继续学习 ...

  3. 转 OC温故:类的三大特性(封装,继承,多态)

    原文标题:OC学习篇之---类的三大特性(封装,继承,多态) 我们都知道,面向对象程序设计中的类有三大特性:继承,封装,多态,这个也是介绍类的时候,必须提到的话题,那么今天就来看一下OC中类的三大特性 ...

  4. [.net 面向对象编程基础] (11) 面向对象三大特性——封装

    [.net 面向对象编程基础] (11) 面向对象三大特性——封装 我们的课题是面向对象编程,前面主要介绍了面向对象的基础知识,而从这里开始才是面向对象的核心部分,即 面向对象的三大特性:封装.继承. ...

  5. [.net 面向对象编程基础] (12) 面向对象三大特性——继承

    [.net 面向对象编程基础] (12) 面向对象三大特性——继承 上节我们说了面向对象的三大特性之一的封装,解决了将对同一对象所能操作的所有信息放在一起,实现统一对外调用,实现了同一对象的复用,降低 ...

  6. [.net 面向对象编程基础] (13) 面向对象三大特性——多态

    [.net 面向对象编程基础] (13) 面向对象三大特性——多态 前面两节,我们了解了面向对象的的封装和继承特性,面向对象还有一大特性就是多态.比起前面的封装和继承,多态这个概念不是那么好理解.我们 ...

  7. Java基础-面向对象第三大特性之多态(polymorphism )

    Java基础-面向对象第三大特性之多态(polymorphism) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.多态概述 多态是继封装,继承之后,面向对象的第三大特性,多态的 ...

  8. 第9章 Java类的三大特性之一:继承

    1.什么是继承 子类继承父类就是对父类的扩展,继承时会自动拥有父类所拥有的处private之外的所有成员作用:增加代码复用语法格式: class 子类名 extends 父类名{…………}第9章 Ja ...

  9. Python 类的三大特性的综合运用 案例

    # --------------------- 类的三大特性的综合运用 案例 ------------------------- # 定义三个类:小狗,小猫,人 # 小狗:姓名,年龄(默认1岁) 吃饭 ...

随机推荐

  1. C#多线程实践——锁和线程安全

    锁实现互斥的访问,用于确保在同一时刻只有一个线程可以进入特殊的代码片段,考虑下面的类: class ThreadUnsafe { static int val1, val2; static void ...

  2. SignalR2.0开发实例之——设置时间、后台其他地方使用集线器、使用自己的连接ID

    一.连接的生命周期设置: 如下: // 该值表示连接在超时之前保持打开状态的时间长度. //默认为110秒 GlobalHost.Configuration.ConnectionTimeout = T ...

  3. 8 个实用的 Linux netcat 命令示例

    Netcat 或者叫 nc 是 Linux 下的一个用于调试和检查网络工具包.可用于创建 TCP/IP 连接,最大的用途就是用来处理 TCP/UDP 套接字. 这里我们将通过一些实例来学习 netca ...

  4. 《Hadoop权威》学习笔记五:MapReduce应用程序

    一.API的配置---Configuration类 API的配置:Hadoop提供了专门的API对资源进行配置,Configuration类的实例(在org.apache.hadoop.conf包)包 ...

  5. ECSTORE 货币格式

    世界上许多国家都有不同的货币 格局和数字 格局 特例 .针对特定的当地化环境正确地 格局化和显示货币是当地化的一个主要部分,ecstore 可以同过后台的设置,来更改货币的格式,具体方式为 后台-&g ...

  6. php提取身份证号码中的生日日期以及验证是否为未成年人的函数

    php 提取身份证号码中的生日日期以及确定是否成年的一个函数.可以同时确定15位和18位的身份证,经本人亲测,非常好用,分享函数代码如下: <?php //用php从身份证中提取生日,包括15位 ...

  7. Python读取Yaml文件

    近期看到好多使用Yaml文件做为配置文件或者数据文件的工程,随即也研究了下,发现Yaml有几个优点:可读性好.和脚本语言的交互性好(确实非常好).使用实现语言的数据类型.有一个一致的数据模型.易于实现 ...

  8. [vim]插件ctrlp

    ctrlp 这个插件可以快速搜索你的文件或者缓冲区 这样很多时候都不必打开nerdtree了. 直接利用快捷键C-p打开搜索命令.

  9. Activiti工作流学习-----基于5.19.0版本(8)

    8.1.5 Start Event 继续上一篇的事件的分享笔记,Start Event指明该处是流程开始,至于开始事件的类型(消息到达开始,指定的事件循环开始等),定义如何开始是在开始事件圆圈图标里面 ...

  10. scheme 解释器Guile 使用

    GNU Guile是一种Scheme编程语言的解释器和虚拟机.Guile是GNU Ubiquitous Intelligent Language for Extensions的缩写.Guile是GNU ...