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 ...
随机推荐
- CMD获取当前目录的绝对路径 (转)
@echo offecho 当前盘符:%~d0echo 当前盘符和路径:%~dp0echo 当前批处理全路径:%~f0echo 当前盘符和路径的短文件名格式:%~sdp0echo 当前CMD默认目录: ...
- Magento How To Display Product Custom Option On list.phtml
Some time we need to display custom option of product on category list page to achive this task we o ...
- [置顶] Android四大组件之BroadcastReceiver
Android四大组件之BroadcastReceiver Broadcast Receiver 广播接收器,是一种负责接收广播消息并对消息做出响应的组件,和Service一样并不提供与用户交互的UI ...
- Android基础之退出应用程序Demo
对于Android我也不是很熟悉,只是学习一些基本内容就OK.所以写的内容也很简单.本Demo要实现的效果就是双击返回键弹出提示框确认是否退出程序. 一.废话少说直接上代码.至于涉及到的相关包在Ecl ...
- jquery 弹出框 showDialog.js具体用法
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABWwAAAImCAIAAABID1T7AAAgAElEQVR4nO3d329c52Hgff1HvPCNLw
- mycat实例(1)
2016二月 22 置原 MyCat - 使用篇(1) 分类:数据库分库分表(Mycat等) (1126) (1) 数据库路由中间件MyCat - 使用篇(1) 基本概念 直接介绍概念太枯燥了,还是拿 ...
- jdbc和数据库的应用
jdbc是Java Data Base Connectivity(java数据库连接): 是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和 ...
- Linux系统守护进程详解ntsysv 可以关掉那些服务
acpid, haldaemon, messagebus, klogd,network, syslogd 以上几个服务必须开启!其他的分析如下: 1.NetworkManager,NetworkMa ...
- [Immutable.js] Converting Immutable.js Structures to Javascript and other Immutable Types
Immutable.js provides several conversion methods to migrate one structure to another. Each Immutable ...
- HLJOJ1015(多源最短路径失真)
意甲冠军:n,m,k,有着n村.有着k路,每个村都有一个电话亭,现在,我们要建立在村中心展台,快递每一个需要同村的中心村,然后返回报告(有向图),有着m电话,假设村配置的手机,那么你并不需要报告.最低 ...