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方法需要如下两步:

  1. 在类接口部分使用@property指令定义属性,使用@property定义属性时无需放在类接口部分的花括号里,而是直接放在@interface、@end之间定义。@property指令放在属性定义的最前面。此外,还可以在@property和类型之间用括号添加一些额外的指示符,可使用的指示符如下:

    • assign:该指示符只是对属性进行简单复制,不更改对所赋的值的引用计数。这个指示符主要用于NSInteger等基本类型以及short、float、结构体等各种C数据类型
    • atomic(nonatomic):制定合成的存取方法是否为原子操作。所谓原子操作就说指是否是线程安全的。atomic表示是线程安全的,但是会造成性能下降。
    • copy:表示当调用setter方法对成员变量进行赋值时,会将被赋值的对象复制一个副本,再将该副本赋值给成员变量。copy指示符会将原成员变量所引用计数减1。当成员变量的类型是可变类型或其子类是可变类型时,被赋值的对象有可能在赋值之后发生变化,如果程序不需要这种修改影响setter方法设置的成员变量的值,就可以考虑使用copy指示符。
  2. 此步是可选的。如果程序需要改变getter、setter方法对应的成员变量的变量名,则可以在类的实现部分使用@synthesize指令

4、继承是面向对象的三大特征之一,也是实现软件重用的重要手段。OC的继承与Java一样,具有单继承的特点,每个子类由且仅有一个直接父类。当子类继承自父类时,子类可以继承得到父类的如下内容:

  • 全部成员变量
  • 全部方法,包括初始化方法

5、子类扩展了父类,在大部分时候,子类总是以父类为基础,额外增加新的成员变量和方法。但有一种情况例外:子类需要重写父类的方法。

  • 无论父类接口部分的成员变量使用何种访问控制符的限制,子类接口部分定义的成员变量都不允许与父类接口部分定义的成员变量重名。
  • 需要指出的是,在类的实现部分定义的成员变量将被限制在该类的内部,因此,父类在类实现部分定义的成员变量对子类没有任何影响。
 1 #import <Foundation/Foundation.h>
 2
 3 //父类Car的接口部分
 4 @interface Car : NSObject{
 5     NSString *_brand;
 6     NSString *_color;
 7 }
 8
 9 - (void)setBrand:(NSString *)brand;
10 - (void)setColor:(NSString *)color;
11 - (void)brake;
12 - (void)quicken;
13
14 @end  
 1 #import "Car.h"
 2
 3 //父类Car的实现部分
 4 @implementation Car
 5 - (void)setBrand:(NSString *)brand{
 6     _brand = brand;
 7 }
 8 - (void)setColor:(NSString *)color{
 9     _color = color;
10 }
11 - (void)brake{
12     NSLog(@"刹车");
13 }
14 - (void)quicken{
15     NSLog(@"加速");
16 }
17 @end 
 1 #import "Car.h"
 2
 3 //继承自Car的子类Taxi的接口部分
 4 @interface Taxi : Car{
 5     NSString *_company;//所属公司
 6 }
 7
 8 //打印发票
 9 - (void)printTick;
10
11 @end  
 1 #import "Taxi.h"
 2
 3 //继承自Car的子类Taxi的实现部分
 4 @implementation Taxi
 5
 6 - (void)printTick{
 7     [super brake];
 8     [self brake];
 9     NSLog(@"%@出租车打印了发票,公司为:%@,颜色为:%@",_brand,_company,_color);
10 }
11
12 @end 

对方法的实现,这里我们看到实现文件中是不需要导入父类Car的头文件的,因为可以认为,Taxi.h头文件中已经包含了Car的头文件了。而且,这里可以使用super关键字来调用父类的方法,同时这里我们也是可以用self关键字来调用,这里看到其实这两种方式调用的效果是一样的,当我们在子类重新实现brake方法的时候(Java中的重写概念),那么这时候super关键字调用的还是父类的方法,而self调用的就是重写之后的brake方法了。同样,我们也是可以使用父类中的属性。

6、OC指针类型的变量有两个:一个是编译时类型,一个是运行时类型。编译时类型由声明该变量时使用的类型决定,运行时类型由实际赋给该变量的对象所决定。如果编译时类型和运行时类型出现不一致,就可能出现所谓的多态(Ploymorphism)。和Java中多态的概念是一样的,主要体现在继承过程中方法重写时的调用上。具体代码就不放了,需要程序员好好体会

时间: 2024-12-19 20:13:23

OC学习6——面相对象的三大特性的相关文章

OC学习篇之---类的三大特性(封装,继承,多态)

之前的一片文章介绍了OC中类的初始化方法和点语法的使用:http://blog.csdn.net/jiangwei0910410003/article/details/41683873,今天来继续学习OC中的类的三大特性,我们在学习Java的时候都知道,类有三大特性:继承,封装,多态,这个也是介绍类的时候,必须提到的话题,那么今天就来看一下OC中类的三大特性: 一.封装 学习过Java中类的同学可能都知道了,封装就是对类中的一些字段,方法进行保护,不被外界所访问到,有一种权限的控制功能,Java

(转载)OC学习篇之---类的三大特性:封装,继承,多态

之前的一片文章介绍了OC中类的初始化方法和点语法的使用,今天来继续学习OC中的类的三大特性,我们在学习Java的时候都知道,类有三大特性:继承,封装,多态,这个也是介绍类的时候,必须提到的话题,那么今天就来看一下OC中类的三大特性: 一.封装 学习过Java中类的同学可能都知道了,封装就是对类中的一些字段,方法进行保护,不被外界所访问到,有一种权限的控制功能,Java中有四种访问权限修饰符:public,default,protected,private,访问权限一次递减的,这样我们在定义类的时

面相对象的三大特性以及定义?

三大特征:继承,封装,多态 继承: 继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法.对象的一个新类可以从现有的类中派生,这个过程称为类继承.新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类).派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要.这也体现了大自然中一般与特殊的关系.继承性很好的解决了软件的可重用性问题.比如说,所有的Windows应用程序都有一个窗口,它们可以看作都是从

java学习中,面向对象的三大特性:封装、继承、多态 以及 super关键字和方法的重写(java 学习中的小记录)

java学习中,面向对象的三大特性:封装.继承.多态 以及 super关键字和方法的重写(java 学习中的小记录) 作者:王可利(Star·星星) 封装     权限修饰符:public 公共的,private 私有的     封装的步骤:          1.使用private 修饰需要封装的成员变量.          2.提供一个公开的方法设置或者访问私有的属性              设置 通过set方法,命名格式:     set属性名();  属性的首字母要大写 访问 通过ge

Golang-面向对象编程三大特性-继承、多重继承

Golang-面向对象编程三大特性-继承 继承基本介绍和示意图 继承可以解决代码复用,让我们的编程更加靠近人类思维. 当多个结构体存在相同的属性(字段)和方法时,可以从这些结构体中抽象出结构体(比如刚才的Student),在该结构体中定义这些相同的属性和方法. 其它的结构体不需要重新定义这些属性(字段)和方法,只需嵌套一个 Student 匿名结构体即可. [画出示意图] 也就是说:在 Golang 中,如果一个 struct 嵌套了另一个匿名结构体,那么这个结构体可以直接访问匿名结构体的字段和

Golang-面向对象编程三大特性-多态

Golang-面向对象编程三大特性-多态 基本介绍 变量(实例)具有多种形态.面向对象的第三大特征,在 Go 语言,多态特征是通过接口实现的.可以按照统一的接口来调用不同的实现.这时接口变量就呈现不同的形态. 快速入门 在前面的 Usb 接口案例,Usb usb ,既可以接收手机变量,又可以接收相机变量,就体现了 Usb 接口 多态特性.[点明] 接口体现多态的两种形式 多态参数 在前面的 Usb 接口案例,Usb usb ,即可以接收手机变量,又可以接收相机变量,就体现了 Usb 接口 多态.

黑马程序员— OC基本语法、类和对象、三大特性

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 第一讲     OC简介及基本语法 Objective-C简称OC是在C语言的基础上,增加了一层最小的面向对象语法,完全兼容C语言,也就是可以在OC代码中混入C语言代码,甚至是C++代码.可以使用OC开发Mac OS X平台和IOS平台的应用程序.简单的介绍了一下OC,下面我们来看看OC的基本语法,学习OC之前我们先学习了C语言,因为OC是在C语言的基础上的一门开发语言,因此OC的很多基本语法

面相对象的三大基本特性五大基本原则

透切理解面向对象三大基本特性是理解面向对象五大基本原则的基础. 三大特性是:封装,继承,多态 所谓封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏.封装是面向对象的特征之一,是对象和类概念的主要特性. 简单的说,一个类就是一个封装了数据以及操作这些数据的代码的逻辑实体.在一个对象内部,某些代码或某些数据可以是私有的,不能被外界访问.通过这种方式,对象对内部数据提供了不同级别的保护,以防止程序中无关的部分意外的改变或错误的使用了对象

PHP学习笔记---封装(面向对象三大特性之一)

回顾:类的概念(对象的抽象化) 对象(类的实例化) 定义 类:成员变量:成员方法: 如何造对象呢: 1 $r = new ren(); new 创建 调用对象的成员  :  $r-> 对于面向对象有三大特性:封装:继承:多态: 关于封装(做类的将类进行封装) 目的是:让类更加安全,不让外界直接访问类的成员: 做法:不让外界直接访问类的成员 具体做法一: 1.成员变为私有:访问修饰符(publc ,private ,protected) public:公共的 所有的地方都能访问到: private