黑马程序员——面向对象编程三大特性
黑马程序员——面向对象编程三大特性
面向对象编程三大特性:封装,继承,多态,(抽象)
***封装的概念与原理***
封装是面向对象的特性之一
封装的好处:降低数据被无用的可能性,保证数据安全性
不封装的缺点:会把自己的属性暴露给外部,失去对该属性的管理权
封装原理:实例变量默认只能被当前类的对象方法访问
**封装实现**
定义设置实例变量(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、如果不存在多态,父类不可以访问子类特有方法