------- android培训、java培训、iOS培训、.Net培训、期待与您交流! ----------
封装
封装的原理:
实例变量默认只能被当前类的对象方法访问,如果强行要访问,只能在成员变量的声明前加@public,而这样的成员变量就暴露给了外界,是不安全的。封装就是不允许外界直接访问成员属性,提供set和get方法给外界,用于设置和获取属性的值。我们可以在set方法里面对参数进行过滤,防止外界的恶意修改。
封装的好处:
(1)过滤不合理的值 (2)屏蔽内部的赋值过程 (3)让外界不必关注内部的细节
set方法的作用:用来设置成员变量,可以在方法里面过滤掉不合理的值
get方法的作用:返回对象内部的成员变量
成员变量的命名规范:
(1)成员变量都以下划线 _ 开头
(2)可以跟get方法的名称区分开
(3)可以跟其他局部变量区分开,一看到下划线开头的变量,肯定是成员变量
#import <Foundation/Foundation.h>
// 声明
@interface Car : NSObject
{
int _wheels; // 轮子个数
}
/*set方法*/
- (void) setWheels:(int)wheels;
/*get方法*/
- (int) wheels;
@end
@implementation Car
// set方法的实现
- (void) setWheels:(int)wheels
{
// 对外面传进来的轮子数进行过滤
if (wheels<=0)
{
wheels = 1;
}
_wheels = wheels;
}
// get方法的实现
- (int) wheels
{
return _wheels;
}
@end
调用方法有两种:一种是使用
[p setAge],[p age]
,另一种是使用点语法,
p.age
,编译器会根据是赋值还是被赋值来判断使用
get
方法还是
set
方法,然后用相应的调用方法替换。
继承
如果两个类有相同的属性和行为,可以抽取出来组成一个新的类,这个新的类就是前面两个类的父类。而前两个类称之为子类。
子类可以在父类的基础上扩充属性和方法,这就是继承。
继承的优点:
(1)不改变原来模型的基础上,扩充方法 (2)建立了类与类之间的联系 (3)抽取了公共代码
继承的细节:
(1)属于单继承(子类只能继承一个父类) (2)属性不可重定义 (3)方法可重写 (4)父类的私有属性能被继承,不能被使用
#import <Foundation/Foundation.h>
#import "Animal.h"
#import "Dog.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
//先查找当前类有没有eat和 bark,如果有,先调用自己的。如果没有,查看父类有没有bark方法。如果父类还没有,去爷爷类查找,以此类推,直到基类也没有就报错。
Dog *d = [Dog new];
[d eat];
[d bark];
//ani 调用它自己的吃和叫得方法
Animal *ani = [Animal new];
[ani eat];
[ani bark];
}
return 0;
}
Animal.h文件
#import <Foundation/Foundation.h>
@interface Animal : NSObject
-(void)eat;
-(void)bark;
@end
Animal.m文件
#import "Animal.h"
@implementation Animal
-(void)eat{
NSLog(@"动物会吃");
}
-(void)bark{
NSLog(@"动物会叫");
}
@end
Dog.h文件
#import "Animal.h"
@interface Dog : Animal
@end
Dog.m文件
#import "Dog.h"
@implementation Dog
//把父类的方法,在子类中重新给实现了
//这种做法就称之为:方法的重写
-(void)eat{
NSLog(@"狗会吃");
}
-(void)bark{
NSLog(@"狗会叫");
}
@end
多态
多态的条件:有继承关系、有方法重写
父类的声明变量指向子类对象。
代码体现:用父类类型的指针指向了子类对象,这就是多态
Person *p = [Student new];
p->age = 100;//给student.age赋值
[p walk];//调用student类的walk方法
多态的局限性:
不能访问子类的属性(可以考虑强制转换)
多态的细节:
动态绑定:在运行时根据对象的类型确定动态调用的方法