OC学习6——面相对象的三大特性
我们在学习Java的时候都知道,类有三大特性:继承,封装,多态,这也是面向对象的三大特征。OC学习篇之---类的三大特性(封装,继承,多态)
1、封装(Encapsulation)是指将对象的状态信息隐藏在对象内部,不允许外部程序直接访问对象内部信息,而是通过该类所提供的方法来实现对内部信息的操作和访问(该隐藏的隐藏,该暴露的暴露)。封装的主要目的是:
- 隐藏类的实现细节
- 让使用者只能通过预先定义好的方法来访问数据,从而可以在该方法中加入控制逻辑,限制对成员变量的不合理访问
- 可进行数据检查,从而有利于保证对象信息的完整性
- 便于修改,提高代码可维护性
2、封装的具体实现通过4个访问控制负来实现变量和方法不同级别的访问权限:@private、@package、@protected和@public。这里的每一个权限跟Java中的基本一致。
- @private(当前类访问权限):如果类中的成员变量用@private访问控制符来限制,则这个成员变量只能在当前类的内部访问。在类的实现部分定义的成员变量默认是@private
- @package(相同映像访问权限):如果类中的成员变量用@package访问控制符来限制,则这个成员变量可以在当前类以及当前类的同一个映像的任意地方访问。所谓的统一映像指的是编译后生成的同一个框架或同一个执行文件,编译器可以将一些类编译成一个框架库,那么这个库中的类之间可以互相直接访问@package修饰的成员变量。
- @protected(子类访问权限):如果类中的成员变量用@protected访问控制符来限制,则这个成员变量可以再当前类、当前类的子类的任意地方访问。在类的接口部分定义的成员变量默认是@protected
- @public(公共访问权限):如果类中的成员变量用@public访问控制符来限制,则这个成员变量可以在任何地方进行访问。
@interface Car : NSObject{ @public
float _capcity; //油量属性
} - (void)run:(float)t; @end
值得注意的是,OC中的方法是没有修饰符的概念的,一般都是公开访问的,即public的,但是我们怎么做到让OC中的一个方法不能被外界访问呢?OC中是这么做的,如果想让一个方法不被外界访问的话,只需要在.m文件中实现这个方法,不要在头文件中进行定义,说白了就是:该方法有实现,没定义,这样外界在导入头文件的时候,是没有这个方法的,但是这个方法我们可以在自己的.m文件中进行使用。
3、在OC2.0之后,它自动合成了setter方法和getter方法,这样就可以避免重复写这些无聊的setter、getter方法。让系统自动合成setter、getter方法需要如下两步:
- 在类接口部分使用@property指令定义属性,使用@property定义属性时无需放在类接口部分的花括号里,而是直接放在@interface、@end之间定义。@property指令放在属性定义的最前面。此外,还可以在@property和类型之间用括号添加一些额外的指示符,可使用的指示符如下:
- assign:该指示符只是对属性进行简单复制,不更改对所赋的值的引用计数。这个指示符主要用于NSInteger等基本类型以及short、float、结构体等各种C数据类型
- atomic(nonatomic):制定合成的存取方法是否为原子操作。所谓原子操作就说指是否是线程安全的。atomic表示是线程安全的,但是会造成性能下降。
- copy:表示当调用setter方法对成员变量进行赋值时,会将被赋值的对象复制一个副本,再将该副本赋值给成员变量。copy指示符会将原成员变量所引用计数减1。当成员变量的类型是可变类型或其子类是可变类型时,被赋值的对象有可能在赋值之后发生变化,如果程序不需要这种修改影响setter方法设置的成员变量的值,就可以考虑使用copy指示符。
- 此步是可选的。如果程序需要改变getter、setter方法对应的成员变量的变量名,则可以在类的实现部分使用@synthesize指令
4、继承是面向对象的三大特征之一,也是实现软件重用的重要手段。OC的继承与Java一样,具有单继承的特点,每个子类由且仅有一个直接父类。当子类继承自父类时,子类可以继承得到父类的如下内容:
- 全部成员变量
- 全部方法,包括初始化方法
5、子类扩展了父类,在大部分时候,子类总是以父类为基础,额外增加新的成员变量和方法。但有一种情况例外:子类需要重写父类的方法。
- 无论父类接口部分的成员变量使用何种访问控制符的限制,子类接口部分定义的成员变量都不允许与父类接口部分定义的成员变量重名。
- 需要指出的是,在类的实现部分定义的成员变量将被限制在该类的内部,因此,父类在类实现部分定义的成员变量对子类没有任何影响。
#import <Foundation/Foundation.h> //父类Car的接口部分
@interface Car : NSObject{
NSString *_brand;
NSString *_color;
} - (void)setBrand:(NSString *)brand;
- (void)setColor:(NSString *)color;
- (void)brake;
- (void)quicken; @end
#import "Car.h" //父类Car的实现部分
@implementation Car
- (void)setBrand:(NSString *)brand{
_brand = brand;
}
- (void)setColor:(NSString *)color{
_color = color;
}
- (void)brake{
NSLog(@"刹车");
}
- (void)quicken{
NSLog(@"加速");
}
@end
#import "Car.h" //继承自Car的子类Taxi的接口部分
@interface Taxi : Car{
NSString *_company;//所属公司
} //打印发票
- (void)printTick; @end
#import "Taxi.h" //继承自Car的子类Taxi的实现部分
@implementation Taxi - (void)printTick{
[super brake];
[self brake];
NSLog(@"%@出租车打印了发票,公司为:%@,颜色为:%@",_brand,_company,_color);
} @end
对方法的实现,这里我们看到实现文件中是不需要导入父类Car的头文件的,因为可以认为,Taxi.h头文件中已经包含了Car的头文件了。而且,这里可以使用super关键字来调用父类的方法,同时这里我们也是可以用self关键字来调用,这里看到其实这两种方式调用的效果是一样的,当我们在子类重新实现brake方法的时候(Java中的重写概念),那么这时候super关键字调用的还是父类的方法,而self调用的就是重写之后的brake方法了。同样,我们也是可以使用父类中的属性。
6、OC指针类型的变量有两个:一个是编译时类型,一个是运行时类型。编译时类型由声明该变量时使用的类型决定,运行时类型由实际赋给该变量的对象所决定。如果编译时类型和运行时类型出现不一致,就可能出现所谓的多态(Ploymorphism)。和Java中多态的概念是一样的,主要体现在继承过程中方法重写时的调用上。具体代码就不放了,需要程序员好好体会
OC学习6——面相对象的三大特性的更多相关文章
- (转载)OC学习篇之---类的三大特性:封装,继承,多态
之前的一片文章介绍了OC中类的初始化方法和点语法的使用,今天来继续学习OC中的类的三大特性,我们在学习Java的时候都知道,类有三大特性:继承,封装,多态,这个也是介绍类的时候,必须提到的话题,那么今 ...
- OC学习篇之---类的三大特性(封装,继承,多态)
之前的一片文章介绍了OC中类的初始化方法和点语法的使用:http://blog.csdn.net/jiangwei0910410003/article/details/41683873,今天来继续学习 ...
- Python学习day24-面向对象的三大特征之继承
figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } img { max- ...
- IOS开发学习笔记010-面向对象的三大特性
面向对象的三大特性 1.封装 2.继承 3.多态 一.封装 将类内部的属性保护起来,在外部不能直接访问,那么如果需要访问怎么办呢? OC提供了set方法来对成员变量进行访问 set方法 1.作用:提供 ...
- 浅谈python的对象的三大特性之继承
前面我们定义了人的类,并用这个类实例化出两个人jack和lily,查看了它们的内存空间. 现在我们再来看看类中所存在的对向对象编程的三大特性之继承的一些特性. 前面定义了一个人的类,可是我们还知道,人 ...
- python面向对象(类和对象及三大特性)
类和对象是什么 创建类 新式类 和 经典类 面向对象三大特性 继承 封装 多态 面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一个模板,模板中包装了多个“函数”供使 ...
- PHP 对象及其三大特性
//面向过程 //类和对象 //对象:任何东西都可以成为对象,类实例化出来的东西 //类:对所有同类的对象抽象出来的东西 //info:code,name,sex,nation,birthday // ...
- python学习之对象的三大特性
在面向对象程序设计中,对象可以看做是数据(特性)以及由一系列可以存取.操作这些数据的方法所组成的集合.编写代码时,我们可以将所有功能都写在一个文件里,这样也是可行的,但是这样不利于代码的维护,你总不希 ...
- OC学习--类和对象的关系
1. 如何创建对象 面向对象解决问题的时候必须有对象, 那应该如何创建对象? 以建造汽车为例子来解释: >建造汽车需要造车图纸, 图纸上 清楚的描述出 汽车具备的属性和功能(行为) >属性 ...
随机推荐
- javaweb-2-Tomcat初步学习与使用
一.Tomcat服务器简介(此点网上官方有详尽的解释,故此不赘述,以学习使用为主) Apache Jakarta的开源项目 JSP/Servlet容器 二.Tomcat的目录结构 三.启动和停止Tom ...
- [最短路]P1078 文化之旅
题目描述 有一位使者要游历各国,他每到一个国家,都能学到一种文化,但他不愿意学习任何一 种文化超过一次(即如果他学习了某种文化,则他就不能到达其他有这种文化的国家).不 同的国家可能有相同的文化.不同 ...
- 深入浅出多线程——ReentrantLock (二)
深入浅出多线程——ReentrantLock (一)文章中介绍了该类的基本使用,以及在源码的角度分析lock().unlock()方法.这次打算在此基础上介绍另一个极为重要的方法newConditio ...
- display:box和display:flex填坑之路
背景分析:最近做移动端项目时,遇到一个常见的需求: 可以滑动的导航,如下图 虽然是很常见的一个布局,但在移动端没有做过,想当然的写下以下的样式,简单描述下: 父元素 width:100%: overf ...
- cinder块存储 后端采用lvm、nfs安装配置
#cinder块存储 后端采用lvm.nfs安装配置 openstack pike 安装 目录汇总 http://www.cnblogs.com/elvi/p/7613861.html #cinder ...
- 51Nod 1256 乘法逆元 扩展欧几里得
基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 给出2个数M和N(M < N),且M与N互质,找出一个数K满足0 < K < N且K * M % N = ...
- PHP实现excel
导入 public function excel_put(){ //先做一个文件上传,保存文件 $path=$_FILES['file']; $filePath = "uploads/&qu ...
- SQL Server学习之路(四):“增删改查”之“删”
0.目录 1.前言 2.通过SSMS删除 3.通过SQL语句删除 3.1 删除单行数据 3.2 删除所有行数据 3.3 删除表和数据库 1.前言 增删改查都是对数据的操作,其中"删" ...
- Linux send和recv
1.send 函数 int send( SOCKET s, const char FAR *buf, int len, int flags ); 不论是客户还是服务器应用程序都用send函数来向TCP ...
- 出现JSONvalue failed .error is Illegal start of token
出现JSONvalue failed .error is Illegal start of token了? 别着急,抽根烟,喝杯水.开工: 1:判断是请求前报的错还是请求后报的错!!这个很重要,我就是 ...