黑马程序员——面向对象编程三大特性

黑马程序员——面向对象编程三大特性

 

------- android培训IOS培训、期待与您交流! ----------

面向对象编程三大特性:封装,继承,多态,(抽象)

***封装的概念与原理***

   封装是面向对象的特性之一

   封装的好处:降低数据被无用的可能性,保证数据安全性

   不封装的缺点:会把自己的属性暴露给外部,失去对该属性的管理权

封装原理:实例变量默认只能被当前类的对象方法访问

**封装实现**

定义设置实例变量(setter)方法和访问实例变量(getter)方法

 

1)setter(设置器)

   在开发过程中,考虑到安全性要求,一般不在成员变量面前使用@public、@protected等关键字修饰,而是使用set方法来为对象提供成员变量的值。在set方法内部可以对一些不合理的赋值进行过滤筛选

   set方法作用:为外界提供一个设置成员变量值的方法

   命名规范:

   1)方法名必须以set开头

   2)set后面跟上成员变量名称,首字母大写:_name    setName

   3)返回值一定是void,不能有返回值

   4)一定要接受一个参数,而且参数类型需要成员变量的类型一致

   5)形参名不能和成员变量名一样(官方推荐成员变量名前加_)

对set中,成员变量设置值,要用set方法

 

2)getter(访问器)

   命名规范:

   1)一定有返回值,返回值类型和成员变量一致

   2)方法名和成员变量一样(去掉下划线的)

   3)不需要接受任何参数

   4)get方法实现中,一定是返回实例变量值

   5)是一个对象方法

以后获取值,统一使用get方法

 1 #import <Foundation/Foundation.h>
 2 @interface Person:NSObject
 3 {
 4    //年龄
 5    int _age;
 6    //身高
 7    float _height;
 8 }
 9 //给每一个实例变量定义两个方法:设置变量的方法(set),获取变量值得方法(get)
10 //set规范:
11 /*
12 1)一定是一个对象方法
13 2)返回值一定是void,不能有返回值
14 3)方法名必须以set开头
15 4)set后面跟上成员实例变量名称,首字母大写
16 5)一定有参数,而且参数类型需要成员变量的类型一致
17 6)形参名一般是去掉下划线的实例变量名
18 7)形参名不能和实例变量同名
19 8)set方法实现中,一定要用形参给实例变量赋值
20 */
21 -(void)setAge:(int)age;
22 -(void)setHeight:(float)height;
23 /*get命名规范:
24 1)一定有返回值,返回值类型和成员变量一致
25 2)方法名和成员变量一样(去掉下划线的)
26 3)不需要接受任何参数
27 4)get方法实现中,一定是返回实例变量值
28 5)是一个对象方法
29 */
30 -(int)age;
31 -(float)height;
32 @end
33 @implementation Person
34 //set方法实现
35 //set方法实现中,一定要用形参给实例变量赋值
36 -(void)setAge:(int)age{
37    _age=age;
38    }
39 -(void)setHeight:(float)height{
40    _height=height;
41    }
42 //get方法实现
43 //get方法实现中,一定是返回实例变量值
44 -(int)age{
45    return _age;
46    }
47 -(float)height{
48    return _height;
49    }
50 @end
51 int main (int argc, const char *argv[])
52 {
53     NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];                        
54     //在此处输入Objective-C代码
55    Person *p=[Person new];
56    [p setAge:20];
57    [p setHeight:2.12f];
58    NSLog(@"%d,%.2f",[p age],[p height]);
59     [pool drain];
60     return 0;
61 }

 

类的继承与派生

***继承***

   概念:类B继承了类A, 那么类B具有类A的所有属性和方法。A派生了B

优缺点:

   继承的好处: 子类拥有父类的所有成员变量和方法, 减少重复代码. 建立类之间的关系。

   继承的缺点: 代码耦合性太强 (类之间的关系太紧密, 如果某个类坏了, 另一个类会受影响)。

   NSObject是基类, 几乎所有的类最终都是继承于它。

   继承注意事项:

   1、子类不能定义和父类同名的变量,但可以继承父类的变量

   2、OC类支持单一继承,不支持多继承,只能有一个父类

   3、OC支持多层继承

***多态***

概念:多态就是某一类事物的多种形态,不同的对象以自己的方式去响应相同名称方法的能力成为多态

 

条件:有继承关系,有方法重写,

     父类的指针指向子类函数的对象

   Dog *g=[Dog new];

   Zeo *z=[Dog new];

优点:简化编程接口,容许在类与类之间重用一些习惯性的命名

@interface Animal:NSObject

-(void)run;

@end

@implementation Animal

-(void)run{

 NSLog(@"动物在跑");

}

@end

********狗*******

子类继承不用再声明了

@interface Dog:Animal

-(void)run;//(可以不用写)

@end

@implementation Dog

-(void)run{

 NSLog(@"狗在跑");

}

@end

********猫*******

@interface Cat:Animal

-(void)run;//(可以不用写)

@end

@implementation Cat

-(void)run{

 NSLog(@"猫在跑");

}

@end

**********不使用多态************

Animal *ani=[Animal new];

[ani run];

Dog *dog=[Dog new];

[dog run];

Cat *cat=[Cat new];

[cat run];

***********使用多态**********

//父类指针指向子类对象

Animal *a1=[Dog new];

[ani run];//狗在跑

Animal *a2=[Cat new];

[ani run];//猫在跑

 

多态注意:

1、如果存在多态,父类是可以访问子类特有的方法

   但是编译器会报错,需要强制转换:[(子类名 *)指针名 子类特有属性];

2、如果不存在多态,父类不可以访问子类特有方法

------- android培训IOS培训、期待与您交流! ----------

原文地址:https://www.cnblogs.com/gaozp/p/4904616.html