oc语言--面向对象的三大特性
一、封装
1.什么是封装
在程序上,隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别;将对象得到的数据和行为(或功能)相结合,形成一个有机的整体,也就是将数据与操作数据的源代码进行有机的结合,形成“类”,其中数据和函数都是类的成员。
1> set方法
① 作用:提供一个方法给外界设置成员变量值,实现对参数的相应过滤
② 命名规范
*方法名必须以set开头
*set后面跟上成员变量的名称,成员变量名首字母必须大写
*返回值一定是void
*一定要接收一个参数,而且参数类型跟成员变量类型一致
*形参的名称不能跟成员变量名一样
#import <Foundation.foundation.h> @interface Student : NSObject : NSObject //声明一个类
{
int _age;//设置一个成员变量
} - (void)study;//声明一个study对象方法
- (void)setAge:(int)age;//声明set方法 @end @implementation Student //对声明的方法进行实现 - (void)setAge:(int)age //set方法的实现
{
if(age <= ) //对不合理的值进行过滤
{
age = ;
} _age = age;
} - (void)study //study方法的实现
{
NSLog("%d岁的学生在学习",age);
} @end int main()
{
Student *stu = [Student new];//新建一个Student类型对象
[stu setAge :];//调用set方法进行赋值操作
[stu study];// 对象调用对象方法
return ;
}
set方法例子
2> get方法
①作用:返回成员变量值
②命名规范
*有返回值,返回值类型与成员变量类型相同
*方法名跟成员变量名相同
*不需要接收任何参数
#import <Foundation.foundation.h> @interface Student : NSObject //声明一个类
{
int _age;//设置一个成员变量
} - (void)study;//声明一个对象方法
- (void)setAge:(int)age;//声明set方法
- (int)age;//声明get方法 @end @implementation Student //对声明的方法进行实现 - (void)setAge:(int)age //set方法的实现
{
if(age <= ) //对不合理的值进行过滤
{
age = ;
} _age = age;
} - (int)age // get方法的实现
{
return _age;
} - (void)study //study方法的实现
{
NSLog("%d岁的学生在学习",[stu age]);//get方法的调用
} @end int main()
{
Student *stu = [Student new];//新建一个Student类型对象
[stu setAge :];//调用set方法进行赋值操作
[stu study];// 对象调用对象方法
return ;
}
get方法例子
3> 封装细节
①成员变量名以_开头,命名规范
*作用1,让成员变量名与get方法名区分开
*作用2,跟局部变量名分开,带_一般就是成员变量名
#import <Foundation.Foundation.h> @interface Score : NSObject //声明Score类
{
int _cScore;//设置成员变量 _cScore
int _ocScore;//设置成员变量 _ocScore
int _totalScore;//设置成员变量 _totalScore
int _averageScore;//设置成员变量 _averageScore
} - (void)setCScore:(int)cScore;//声明set方法
- (int)cScore;//声明get方法 - (void)setOcScore:(int)ocScore;//声明set方法
- (int)ocScore;//声明get方法 - (int)totalScore;//声明get方法
- (int)averageScore;//声明get方法 @end @implementation Score //方法的实现 - (void)setCScore:(int)cScore //set方法的实现
{
_cScore = cScore;
_totalScore = _cScore + _ocScore;//计算总分,监听成员变量的改变
_averageScore = _totalScore/;//计算平均分
} - (int)cScore // get方法的实现
{
return _cScore;
} - (void)setOcScore:(int)ocScore //set方法的实现
{
_ocScore = ocScore;
_totalScore = _cScore + _ocScore; //计算总分,监听成员变量的改变
_averageScore = _totalScore/;//计算平均分
} - (int)ocScore // get方法的实现
{
return _ocScore;
} - (int)totalScore // get方法的实现
{
return _totalScore;
}
- (int)averageScore // get方法的实现
{
return _averageScore ;
} @end int main()
{
Score *sc = [Score new]; int t = [sc _totalScore];
int a = [sc _averageScore]; NSLog("总分是%d,平均分是%d",t, a); return ;
}
封装练习
4> 封装的好处
*过滤不合理的值
*屏蔽内部的赋值过程
*让外部不必关注内部细节
二、继承
1.继承
通过继承,子类可以拥有父类中所有的成员变量和方法
#import <Foundation.Foundation.h> @interface Animal : NSObject //声明一个Animal类,并且继承了NSObject
{
int _age; // 声明了两个成员变量
double _weight;
}
- (void)setAge:(int)age; //声明set方法
- (void)setWeight:(double)weight;
- int)age; //声明get方法
- (double)weight;
- (void)run; @implementation Animal //类的实现
- (void)setAge:(int)age //set方法的实现
{
_age = age;
} - (void)setWeight:(double)weight//set方法的实现
{
_weight = weight;
} - int)age //get方法的实现
{
return _age;
} - (double)weight //get方法的实现
{
return _weight;
} - (void)run
{
NSLog(@"动物跑了起来");
}
@end @interface Dog : Animal //Dog继承了Animal里面所有的成员变量和方法 @end @implementation Dog @end int main()
{
Dog *d = [Dog new];
[d setAge:];
[d setWeight:20.0];
NSLog(@"%岁的狗,%d公斤",[d age], [d weight]); return ;
}
继承例子
2.重写
子类重新实现父类中某个方法,覆盖父类以前的做法
#import <Foundation.Foundation.h> @interface Animal : NSObject //声明一个Animal类,并且继承了NSObject
{
int _age; // 声明了两个成员变量
double _weight;
}
- (void)setAge:(int)age; //声明set方法
- (void)setWeight:(double)weight;
- int)age; //声明get方法
- (double)weight;
- (void)run; @implementation Animal //类的实现
- (void)setAge:(int)age //set方法的实现
{
_age = age;
} - (void)setWeight:(double)weight//set方法的实现
{
_weight = weight;
} - int)age //get方法的实现
{
return _age;
} - (double)weight //get方法的实现
{
return _weight;
} - (void)run
{
NSLog(@"动物跑了起来");
}
@end @interface Dog : Animal //Dog继承了Animal里面所有的成员变量和方法 - (void)run;
@end @implementation Dog
- (void)run //重写父类run方法
{
NSLog(@"%岁,%d公斤的狗跑了起来",[d age], [d weight]);
} @end int main()
{
Dog *d = [Dog new];
[d setAge:];
[d setWeight:20.0];
[d run];
NSLog(@"%岁的狗,%d公斤",[d age], [d weight]); return ;
}
重写(例子)
3.super作用
1> 直接调用父类中的某个方法
2> super处在对象方法中,就调用父类的对象方法;super处在类方法中,就调用父类的类方法
3> 使用场合:子类重写父类方法时,想保留父类方法的一些行为
4.使用注意
1> 父类必须声明在子类前面
2> 子类不能拥有和父类相同的成员变量
3> 调用某个方法时,优先去当前类中寻找,如果找不到,再去父类中寻找
4> oc语言是单继承
5.缺点
*耦合性太强,删除父类后,子类就不能够继续使用
6.好处
* 不改变原来模型的基础上,拓充方法
* 建立了类与类之间的联系
* 抽取了公共代码
7.使用场合
1> 当两个类拥有相同的属性和方法时,就可以将相同的东西抽取出到父类中
2> 当A类中拥有B类的部分属性和方法时,可以考虑让B类继承A类
3> 组合:xxx拥有xx; 继承:xxx是xx
三、多态
1.多态:多种形态
1> 没有继承就没有多态
2> 代码体现:父类类型指针指向子类对象
#import <Foundation.Foundation.h> @interface Animal : NSObject
- (void)eat;
@end @implementation Animal
- (void)eat
{
NSlog(@"动物吃东西");
}
@end @interface Dog : Animal
- (void)eat;
@end @implementation Dog
- (void)eat
{
NSlog(@"Dog吃东西");
}
@end int main()
{
//多种形态
Dog *d = [Dog new];// Dog类型 //多态;父类指针指向子类对象
Animal *a = [Dog new]; [a eat];//调用方法时,检测对象的真实类型 rerurn ;
}
多态(例子)
2.优缺点
1> 好处:如果函数\方法的参数类型使用的父类类型,可以传入子类和父类对象
2> 局限性:父类类型变量不能够直接调用子类特有的方法(编译过程会有警告)。必须强转为子类类型便后后,才能够直接调用子类特有的方法。
四、自我总结
面向对象的三大特性是面向对象语言的精华所在。面向对象是基于万物皆对象这个哲学观点。把一个对象抽象成类,具体上就是把一个对象的静态特征和动态特征抽象成相应的属性和方法,也就是把一类事物的算法和数据结构封装在一个类之中,程序就是多个对象和互相之间的通信组成的。面向对象具有封装性,继承性,多态性,封装隐蔽了对象内部不需要暴露给外人的细节,使得内部细节的变动跟外界不相关,只单纯依靠提供的接口进行通信。封装性降低了编程的复杂,通过继承,使得新建一个类变得更加容易,一个类从父类那里获得其方法和属性的工作就交给了编译器。而继承、实现和运行时的类型绑定机制所产生的多态,使得不同的类所产生的对象能够对相同的消息作出不同的反应,这极大地提高了代码的通用性。言而总之,面向对象的三大特性大大提高了程序的重用性和可维护性。
oc语言--面向对象的三大特性的更多相关文章
- OC面向对象的三大特性
一.面向对象的三大特性:封装(成员变量).继承和多态 1. set方法和get方法 1. set方法和get方法的使用场合 @public的成员可以被随意赋值,应该使用set方法和get方法来管理成员 ...
- 面试问题之C++语言:面向对象的三大特性
转载于:https://www.cnblogs.com/BEN-LK/p/10720249.html 面向对象的三大特性:封装.继承.多态 封装:就是把客观事物封装成抽象的类,并且类可以把自己的数据和 ...
- 谈谈Java面向对象的三大特性
Java面向对象的三大特性就是指封装.继承.多态了. 一.封装: 概念:封装是指隐藏对象的属性和实现细节,仅对外提供公共访问方式. (举例:笔记本电脑就是一个封装体,Java语言中最小的封装体就是函数 ...
- JavaScript面向对象的三大特性
1.JavaScript面向对象的三大特性 JavaScript的三大特性:封装性.继承性.多态性. 2.JavaScript实现封装特性 在一些静态类型的语言如java中,本身语法就提供了这些功能. ...
- python基础学习Day17 面向对象的三大特性之继承、类与对象名称空间小试
一.课前回顾 类:具有相同属性和方法的一类事物 实例化:类名() 过程: 开辟了一块内存空间 执行init方法 封装属性 自动的把self返回给实例化对象的地方 对象:实例 一个实实在在存在的实体 组 ...
- Java基础-面向对象第三大特性之多态(polymorphism)
Java基础-面向对象第三大特性之多态(polymorphism) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.多态概述 多态是继封装,继承之后,面向对象的第三大特性,多态的 ...
- 面向对象:三大特性、类成员、property
一.类的基础知识 python 一切皆为对象. 我们以前的str,list,int 都是对象. 1.1 类的定义 与 调用 class 关键字用来定义类,注意类名首字母大写. 类的调用,先实例化一个类 ...
- 菜鸟笔记 -- Chapter 6.4 面向对象的三大特性
6.4.1 三大特性概述 面向对象的三大特性是Java中一个很重要的基本理念. 封装是面向对象的核心思想.将对象的属性和行为封装起来,其载体就是类,类通常对客户隐藏其实现细节,这就是封装的意思.采用 ...
- JavaScript中面向对象的三大特性(一个菜鸟的不正经日常)
经过几天的学习,把jQuery给啃会了,但是运用的还不算特别熟练,总感觉自己在JavaScript方面的基础十分欠缺,所以继续拾起JavaScript,开始更好的编程之旅~ 今天学的是JavaScri ...
随机推荐
- 在Ubuntu上安装VmTools
1.添加VmTools 2.解压 .tag.gz文件 使用Linux命令: tar –zxvf src –c dis -c: 建立压缩档案 -x:解压 -t:查看内容 -r:向压缩归档文件末尾追加文件 ...
- 15款免费WiFi入侵破解安全测试工具
以下是的15款免费(接近免费)的WiFi网络入侵测试工具.这些工具将帮你发现流氓AP,弱Wi-Fi密码等安全隐患,在黑客光临之前把漏洞补上. 一.Vistumbler扫描器 Kismet是一个开源的W ...
- 【转】Android 源码下利用jni编译自己的项目(参考系统development/samples/SimpleJNI)
原文网址:http://blog.csdn.net/qiuxiaolong007/article/details/7860481 记于正文前:环境是ubuntu10.10,android 源码是2.0 ...
- Uboot与Linux之间的参数传递
U-boot会给Linux Kernel传递很多参数,如:串口,RAM,videofb等.而Linux kernel也会读取和处理这些参数.两者之间通过struct tag来传递参数. U-boot把 ...
- c++之 变量
变量的基本操作 变量就是一个可以变化的量,变量由变量类型.变量名.初始值(可选)组成,例如: int abc = 10; 变量类型:int 变量名:abc 初始值:10 // 该值为可选项,在创建变量 ...
- redis简单配置
由于前段时间使用Kestrel,同时要操作Memcached及时更新缓存,又要操作database,持久化数据. 貌似Redis既可以当Cache又可以当Queue!于是,今天开始研究Redis! 一 ...
- Jpeg(模拟)
Jpeg Time Limit:2000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Submit Status ...
- java与.net比较学习系列(5) 流程控制语句
java中流程控制语句主要分为以下几类,第一,条件语句,主要包括if语句和switch语句.第二,循环语句,主要包括while循环语句,for循环语句.第三,跳转语句,主要包括三种,break跳出语句 ...
- POJ 3114 Countries in War(强连通+最短路)
POJ 3114 Countries in War 题目链接 题意:给定一个有向图.强连通分支内传送不须要花费,其它有一定花费.每次询问两点的最小花费 思路:强连通缩点后求最短路就可以 代码: #in ...
- Udacity调试课笔记之断言异常
Udacity调试课笔记之断言异常 这一单元的内容不是很多,如Zeller教授所说,就是如何写.检查断言,并如何使用工具实现自动推导出断言的条件. 现在,多数的编程语言,尤其是高级编程语言都会有内置的 ...