面向对象的三大特性

  • 封装
  • 继承
  • 多态

其实抽象也是面向对象的一大特性

面向过程和面向对象

一、面向过程和面向对象思想的区别:
1.面向过程关注的是解决问题需要哪些步骤
2.面向对象关注的是解决问题需要哪些对象

二、常用术语
1. 面向过程 Procedure Oriented
2. 面向对象 Object Oriented      简称: OO
3. 面向对象编程 Object Oriented Programming      简称: OOP

封装

一、封装的好处
1. 保护数据的安全
2. 隐藏复杂内容
3. 隔离变化(底层怎么变化不显示给用户)

二、set和get方法
(1)set方法
<1> 作用:提供一个方法给外界设置成员变量的值,可以在方法里面对参数经行相应的过滤
<2> 命名规范
1. 方法名必须以set开头
2. set后面跟成员变量的名称,成员变量的首写字母必须大写
3. 返回值一定是void
4. 一定要接受一个参数,而且参数类型跟成员变量类型一致

(2)get方法
<1> 作用:返回对象内部的成员变量
<2> 命名规范
1. 肯定有返回值,返回值的类型肯定与成员变量的类型一致
2. 方法名跟成员变量名一样
3. 不需要接受任何参数

三、封装练习
        设计一个成绩类,c语言成绩可读可写,oc成绩可读可写,总分只读,平均分只读
(1)Score类的设计
                                                                     Score.h文件


#import <Foundation/Foundation.h>@interface Score : NSObject
{// c语言成绩float _cScore;// oc语言成绩float _ocScore;// 总成绩float _totalScore;// 平均成绩float _avgScore;
}// c成绩的setter和getter声明
- (void)setCScore:(float)cScore;
- (float)cScore;// oc成绩的setter和getter声明
- (void)setOcScore:(float)ocScore;
- (float)ocScore;// 总成绩的getter声明
- (float)totalScore;// 平均成绩的getter声明
- (float)avgScore;@end

Score.m文件


#import "Score.h"@implementation Score
// c成绩的setter和getter实现
- (void)setCScore:(float)cScore
{_cScore = cScore;// 计算总分_totalScore = _cScore + _ocScore;// 计算平均分_avgScore = _totalScore / 2;
}
- (float)cScore
{return _cScore;
}// oc成绩的setter和getter实现
- (void)setOcScore:(float)ocScore
{_ocScore = ocScore;// 计算总分_totalScore = _cScore + _ocScore;// 计算平均分_avgScore = _totalScore / 2;}
- (float)ocScore
{return _ocScore;
}// 总成绩的getter实现
- (float)totalScore
{return _totalScore;
}// 平均成绩的getter实现
- (float)avgScore
{return _avgScore;
}@end

(2)main.m文件

继承

一、继承的优缺点
继承的优点:
1. 抽取重复的代码
2. 建立了类与类之间的关系
3. 子类可以拥有父类的所用成员变量和方法
继承的缺点:
1. 耦合性太强

二、继承的使用注意
1. 重写:子类重新实现父类中的某个方法,会覆盖父类以前的方法
2. 子类不能拥有和父类相同的成员变量
3. 调用某个方法时,优先去当前类中找,如果找不到再去父类中找
4. 父类必须声明在子类前面

三、继承的练习
        设计一个动物类,拥有速度和体重两个成员变量,吃和跑两个方法,设计一个狗类,拥有速度和体重两个成员变量,吃、跑和叫三个方法
(1)Animal类的设计
                                                                     Animal.h文件


#import <Foundation/Foundation.h>@interface Animal : NSObject
{// 速度int _speed;// 体重float _weight;
}// 速度的setter和getter的声明
- (void)setSpeed:(int)speed;
- (int)speed;// 体重的setter和getter的声明
- (void)setWeight:(float)weight;
- (float)weight;// 跑方法的声明
- (void)run;// 吃方法的声明
- (void)eat;@end

Animal.m文件


#import "Animal.h"@implementation Animal
// 速度的setter和getter的声明
- (void)setSpeed:(int)speed
{_speed = speed;
}
- (int)speed
{return _speed;
}// 体重的setter和getter的声明
- (void)setWeight:(float)weight
{_weight = weight;
}
- (float)weight
{return _weight;
}// 跑方法的实现
- (void)run
{NSLog(@"动物在以每小时%d米的速度狂奔", self.speed);
}// 吃方法的实现
- (void)eat
{NSLog(@"动物体重已经%.2f斤了还在吃", self.weight);
}
@end

(2)Dog类的设计
                                                                     Dog.h文件


#import "Animal.h"@interface Dog : Animal
// 叫的方法声明
- (void)bark;
@end

Dog.m文件


#import "Dog.h"@implementation Dog
// 叫的方法实现
- (void)bark
{NSLog(@"狗在叫");
}
// 重写父类跑方法
- (void)run
{NSLog(@"狗在以每小时%d米的速度狂奔", self.speed);
}// 重写父类吃方法
- (void)eat
{NSLog(@"狗体重已经%.2f斤了还在吃", self.weight);
}
@end

(3)main.m

组合模式

组合模式的定义:把具有相同基类的对象组合到树形结构中,以表示“部分—整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性

依赖关系

A对象作为B对象的局部变量或是方法形参的,B依赖于A,这时候我们成为A与B之间存在一种依赖关系。

面向对象设计中:
耦合度:当修改一个对象的时候,对另外一个对象的影响程度
低耦合:当修改一个对象的时候,对其他对象的影响比较小
高内聚:一个对象仅仅做自己相关的事情

例:美女用手机给土豪打电话

- (void)callPhoneToTuHao:(IPhone *)iphone;

关系: 美女对象依赖于手机对象

关联关系

关联关系(HasA关系):当一个对象拥有另外一个对象的时候,当B对象为A对象的成员变量的时候,B对象与A对象之间存在一种关联关系

多态

一、多态的好处
1. 多态的主要好处就是简化了编程接口(它容许类与类之间重用一些习惯性的命名)

二、多态的局限性
1. 多态的局限性:父类类型的指针变量不能直接调用子类特有的方法,必须强转为子类类型变量后,才能直接调用子类特有的方法

三、多态的简单总结
1. 没有继承就没有多态
2. 代码的体现:父类类型的指针指向子类对象

四、多态的简单实现
(1)Animal类的设计
                                                                     Animal.h文件


#import <Foundation/Foundation.h>@interface Animal : NSObject
{// 速度int _speed;// 体重float _weight;
}// 速度的setter和getter的声明
- (void)setSpeed:(int)speed;
- (int)speed;// 体重的setter和getter的声明
- (void)setWeight:(float)weight;
- (float)weight;// 跑方法的声明
- (void)run;// 吃方法的声明
- (void)eat;@end

Animal.m文件


#import "Animal.h"@implementation Animal
// 速度的setter和getter的声明
- (void)setSpeed:(int)speed
{_speed = speed;
}
- (int)speed
{return _speed;
}// 体重的setter和getter的声明
- (void)setWeight:(float)weight
{_weight = weight;
}
- (float)weight
{return _weight;
}// 跑方法的实现
- (void)run
{NSLog(@"动物在以每小时%d米的速度狂奔", self.speed);
}// 吃方法的实现
- (void)eat
{NSLog(@"动物体重已经%.2f斤了还在吃", self.weight);
}
@end

(2)Dog类的设计
                                                                     Dog.h文件


#import "Animal.h"@interface Dog : Animal
// 叫的方法声明
- (void)bark;
@end

Dog.m文件


#import "Dog.h"@implementation Dog
// 叫的方法实现
- (void)bark
{NSLog(@"狗在叫");
}
// 重写父类跑方法
- (void)run
{NSLog(@"狗在以每小时%d米的速度狂奔", self.speed);
}// 重写父类吃方法
- (void)eat
{NSLog(@"狗体重已经%.2f斤了还在吃", self.weight);
}
@end

(3)main.m文件

动态绑定和动态类型检测方法

一、动态绑定
        在objective-c中,一个对象是否能调用指定方法,不是由编译器决定的,而是由运行时决定的,这被称作是方法的动态绑定

二、动态类型检测方法
        对象在运行时获取其类型的能力称为内省,内省可以有种方法来实现

(1)判断一个对象是否为某个类或子类的实例对象

- (BOOL)isKindOfClass:(Class)aClass;

调用格式: [对象 isKindOfClass:类对象]

(2)判断一个对象是否为某个类的实例对象

- (BOOL)isMemberOfClass:(Class)aClass;

调用格式: [对象 isMemberOfClass:类对象]

(3)判断一个类某个类是否为另一个类的子类

+ (BOOL)isSubclassOfClass:(Class)aClass;

调用格式: [类名/类对象 isSubclassOfClass:类对象]

(4)判断一个对象能否响应某个方法

- (BOOL)respondsToSelector:(SEL)aSelector;

调用格式: [对象 respondsToSelector:SEL类型数据]

(5)判断一个类是否有某个方法

+ (BOOL)instancesRespondToSelector:(SEL)aSelector;

调用格式: [类名/类对象 instancesRespondToSelector:SEL类型数据]


—— 如果您有不同的见解,请随时指出,期待与您的交流!——


OutMan——面向对象的三大特性、对象和对象之间的关系以及动态类型检测方法相关推荐

  1. Java学习笔记二十五:Java面向对象的三大特性之多态

    Java面向对象的三大特性之多态 一:什么是多态: 多态是同一个行为具有多个不同表现形式或形态的能力. 多态就是同一个接口,使用不同的实例而执行不同操作. 多态性是对象多种表现形式的体现. 现实中,比 ...

  2. 到底什么是面向对象,面试中怎么回答。面向过程和面向对象的区别是什么。java跨平台特性以及java和C++的区别。面向对象的三大特性——封装、继承和多态。面向对象的高拓展性以及低耦合度怎么体现?

    Java语言具有的特点:面向对象.跨平台.多线程以及网络编程 1. 和C++的区别 1.1 Java隐蔽了C++的指针,避免指针直接操作,程序更加安全. 1.2 Java类继承只能单继承,避免了C++ ...

  3. 面向对象之三大特性:继承,封装,多态

    python面向对象的三大特性:继承,封装,多态. 1. 封装: 把很多数据封装到⼀个对象中. 把固定功能的代码封装到⼀个代码块, 函数, 对象, 打包成模块. 这都属于封装的思想. 具体的情况具体分 ...

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

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

  5. C++ 面向对象程序三大特性之 继承

    目录 继承的概念 继承的定义及使用 继承方式和访问权限 基类和派生类对象的赋值转换 继承中的各成员的作用域 派生类的默认成员函数 构造函数 拷贝构造 赋值运算符重载函数 析构函数 继承与友元 继承与静 ...

  6. 面向对象的三大特性:封装、继承、多态

    面向对象的三大特性 面向对象的三大特性:封装.继承.多态 封装 封装,成员变量的封装,保证了数据的安全性.封装的好处:过滤了不合理的值.屏蔽内部的赋值过程.让外界不必关注内部的细节 Set方法 1.  ...

  7. 面向对象:三大特性与五大原则

    面向对象:三大特性与五大原则 面向对象(Object Oriented, OO)是软件开发方法.面向对象的概念和应用已超越了程序设计和软件开发,扩展到如数据库系统.交互式界面.应用结构.应用平台.分布 ...

  8. java面向对象特性_java面向对象编程三大特性

    一说到java面向对象编程就想到面向对象的三大特性,封装,继承和多态,下面我们来具体分析以下这三大特性在编程中是如何具体体现的. 封装 将类的属性和具体实现细节隐藏,只提供相关的接口和方法来对隐藏信息 ...

  9. 面向对象的三大特性之多态,封装基础

    面向对象的三大特性  :  继承    多态    封装 多态:一个类表现出多种形态:通过继承来实现的 在python中:由于函数的参数不需要指定数据类型,所以也不需要通过继承的形式来统一一组类的类型 ...

  10. 面向对象进阶 三大特性

    一.类方法.静态方法 1. 类方法 第一个形参是类对象的方法 需要用装饰器@classmethod来标识其为类方法,对于类方法,第一个参数必须是类对象,一般以cls作为第一个参数. class Dog ...

最新文章

  1. leetcode python 032 识别最长合法括号
  2. 基于 OpenCV 的图像阴影去除
  3. 中文模糊查询性能优化 by PostgreSQL trgm
  4. winform上控件太多,绘制时会逐个出现,通常说双缓冲能解决但实际不能解决的问题的解决方法。
  5. 72. Leetcode 99. 恢复二叉搜索树 (二叉搜索树-中序遍历类)
  6. redis存储java对象存储_Spring-Data-Redis存储对象(redisTemplate)
  7. 【Android】如何查看android cpu是32位还是64位
  8. keras.metrics中的accuracy
  9. 计算机更改桌面,2010年职称计算机考试:更改桌面背景和颜色
  10. 开发者必备Mysql命令
  11. ubuntu8.10_深圳源
  12. 用C++实现跨平台游戏开发之Irrlicht引擎
  13. 中科院-杨力祥视频教程 08课程
  14. rhino6.5安装教程
  15. ios备忘录下载安卓版_iOS8备忘录
  16. UI设计学习笔记(7-12)
  17. IT男吃什么最利于健康
  18. 汽车芯片“后短缺时代”,破局已定
  19. Linux下dcm2niix使用
  20. 《2022 中小企业快成长之年,上云 选对平台是关键,这次我站华为云》

热门文章

  1. Deep Layer Aggregation
  2. 网卡设置 网卡的高级设置说明
  3. ALG:应用层网关(防火墙)
  4. Python远程开关机
  5. 工作中常用的英语缩写
  6. ng4 html路由跳转,Angular4.x通过路由守卫实现动态跳转界面步骤详解
  7. C/C++程序设计与算法第十一周:零点定理求方程的根
  8. CICD篇-Travis-CI环境搭建
  9. UESTC_树上战争 CDOJ 32
  10. 7-46 新浪微博热门话题 (30分)