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. 如何创建对象 面向对象解决问题的时候必须有对象, 那应该如何创建对象? 以建造汽车为例子来解释: >建造汽车需要造车图纸, 图纸上 清楚的描述出 汽车具备的属性和功能(行为) >属性 ...
随机推荐
- idea+scala+spark遇到的一些问题
1.windows中以本地模式运行spark遇到"Could not locate executable null\bin\winutils.exe in the Hadoop binari ...
- 0:A+B Problem-poj
0:A+B Problem 总时间限制: 1000ms 内存限制: 65536kB 描述 Calculate a + b 输入 Two integer a,,b (0 ≤ a,b ≤ 10) 输出 ...
- Unity灯光烘焙
Unity3D烘焙技术 一.Light灯光场景烘焙1.理论理解:(1)烘焙背景:在一个场景中,由于灯光组件起到实时渲染的效果,并直接与计算机硬件GPU渲染器进行交互作用,因此对计算机显卡性能不良,以至 ...
- TCP/IP 协议栈 ------ ICMP
I C M P经常被认为是 I P层的一个组成部分.它传递差错报文以及其他需要注意的信息.I C M P报文通常被I P层或更高层协议( T C P或U D P)使用.一些I C M P报文把差错报文 ...
- webpack构建项目
webpack构建项目 案例代码戳这里 ps:每个案例对应相应的demo,例如"案例1"对应"demo1" 一.webpack基本功能及简单案例 安装webpa ...
- Windows Intellij环境下Gradle的 “Could not determine Java version from ‘9.0.1’”的解决方式
当我导入Gradle项目初试Java spring的时候,遇到下面报错: Gradle complete project refresh failed Error:Could not determin ...
- PHP入门怎么选?大学生适合学习吗?
大学毕业,面对竞争激烈的社会,理想总是很丰满,现实却很残酷.在硕士.博士都随处可见的今天,本科和大专文凭就显得苍白无力,在面试官问你"有没有工作经验"的时候,你是不是只想起实习期间 ...
- codeforces 630C - Lucky Numbers 递推思路
630C - Lucky Numbers 题目大意: 给定数字位数,且这个数字只能由7和8组成,问有多少种组合的可能性 思路: 假设为1位,只有7和8:两位的时候,除了77,78,87,88之外还哇哦 ...
- Linux 配置Jenkins
一.安装包下载: 1. jdk-8u152-linux-x64.tar.gz下载: wget http://download.oracle.com/otn-pub/java/jdk/8u152-b16 ...
- Java 代码学习之理解数据类型中的坑
package dailytest; import org.junit.Test; public class DataTypeTest { /** * 当有字符串第一次参与运算后,+成了连接符的作用 ...