------
Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
<1>什么是继承?
继承是面向对象的一个核心概念。在Objective-C的继承体系中,位于最顶层的根类是NSObject,我们定义的所有类都是它的子类。子类也叫扩展类或派生类。
实例:汽车类
方法:move ,load
飞车:
属性:speed,weight ,flySpeed
方法:move ,load,fly
#import <Foundation/Foundation.h>
// 核心:飞车本质是车的一种
// 拥有汽车类所有的属性和方法
// 飞车又不是普通的车,能飞在空中
//两种方式:<1>重写车的属性和方法 存在问题:代码的复用性太低(同样的代码有两份) 不好维护
#import"Car.h"
//<2> oc中的继承
// 定义了一个flycar ,这个类继承于car
// 称呼:子类,父类
// 特性:子类会拥有父类的属性和方法
@interface FlyCar : Car
//flycar类拥有父类car中的所有属性
//
//
{
double _flyspeed;
}
-(void)fly;
@end
总结:
(1)oc中每个类都必须要有个父类。如果不知道要继承哪个类,那么就继承NSObject --->oc中的根类,其他类都会直接或者间接 的继承这个类
(2)oc中一个类能不能继承多个类(多继承)
oc中一个类只能继承于一个类,不能继承于多个类
(3)init方法
oc每个类只需要初始化自己的实例变量
实现子类的时候,因为子类中包含了父类的实例 所以子类中一定执行了父类init方法
继承的好处:
1> 抽取重复代码
2> 建立了类之间的关系
3> 子类可以拥有父类中的所有成员变量和方法
继承的使用场合
1> 当两个类拥有相同属性和方法的时候,就可以将相同的东西抽取到一个父类中
2> 当A类完全拥有B类中的部分属性和方法时,可以考虑让B类继承A类
2.这个类不仅缺少方法,而且缺少需要的属性
car不仅缺少实例变量:flySpeed 缺少方法:fly
3.如果父类继承下的方法不满足需求
例如父类继承下来的init方法不能满足需求
在子类中重写这个方法
特性:
(1)无论是任何权限 当前类方法直接通过变量名访问;
(2)公有的:外界可以直接方法 访问形式obj->_a=100;
(2)oc中一个类能不能继承多个类(多继承)
oc中一个类只能继承于一个类,不能继承于多个类
(3)init方法
oc每个类只需要初始化自己的实例变量
实现子类的时候,因为子类中包含了父类的实例 所以子类中一定执行了父类init方法
-(id)init
{
//self是方法隐藏的参数
// self存储的是当前对象的地址
// car *car=[[Car alloc] init];
// 实例方法中:self 的值就是car指针的值
//self什么时候使用
// (1)调用当前类的方法 [self print];
// (2)使用property self.name=@"xiaoli";
//super是编译器的指示符
// 表示父类
// 用法:执行从父类继承下来的方法
if (self =[super init]) {
NSLog(@"car init");
}
return self;
}
继承的好处:
1> 抽取重复代码
2> 建立了类之间的关系
3> 子类可以拥有父类中的所有成员变量和方法
继承的使用场合
1> 当两个类拥有相同属性和方法的时候,就可以将相同的东西抽取到一个父类中
2> 当A类完全拥有B类中的部分属性和方法时,可以考虑让B类继承A类
<2>如何扩展一个类?如何复用已有的代码
1.NSMutableString 不存在reverseString2.这个类不仅缺少方法,而且缺少需要的属性
car不仅缺少实例变量:flySpeed 缺少方法:fly
3.如果父类继承下的方法不满足需求
例如父类继承下来的init方法不能满足需求
在子类中重写这个方法
特性:
(1)无论是任何权限 当前类方法直接通过变量名访问;
(2)公有的:外界可以直接方法 访问形式obj->_a=100;
公有的继承到子类中还是公有的
(3)私有的 外界不能直接访问,需要通过获取方法和设置方法去间接访问
访问形式:[obj name];
访问形式:[obj name];
(4)受保护的 外界不能直接访问,需要通过获取方法和设置方法去间接访问
访问形式:[obj name];
父类中是受保护的,子类中也是受保护的
访问形式:[obj name];
父类中是受保护的,子类中也是受保护的
父类中是私有的不能继承到子类中
1:父类私有的,子类能不能直接访问??------>不能
2:子类对象里有没有父类的私有实例变量------->内存中是有
3:子类如何范围父类私有的实例变量
第一步:添加实例变量@property
第二步:子类中通过self.named 形式访问
1:父类私有的,子类能不能直接访问??------>不能
2:子类对象里有没有父类的私有实例变量------->内存中是有
3:子类如何范围父类私有的实例变量
第一步:添加实例变量@property
第二步:子类中通过self.named 形式访问
@public
int _a;
@private
int _b;
@protected
int _c;
//默认情况下是受保护的
double _speed;
double _weight;
@property double speed;
@property double weight;
@property int b;
//定义了Property,么有定义对应的实例变量
// 默认生成实例变量权限是私有的
// 子类中需要用self.name的实现访问
@property (copy)NSString *name;
//方法
-(void)move;
-(void)load;
总结: 父类 子类
公有 公有
私有 无法继承(本质:没有访问权限,子类中有变量的空间)
受保护 受保护
4.方法的重写
1.重写:子类重新实现父类中的某个方法,覆盖父类以前的做法
2.注意
1> 父类必须声明在子类的前面
2> 子类不能拥有和父类相同的成员变量
3> 调用某个方法时,优先去当前类中找,如果找不到,去父类中找
3.坏处:耦合性太强
#import <Foundation/Foundation.h>
// Person
@interface Person : NSObject
{
int _age;
}
- (void)setAge:(int)age;
- (int)age;
- (void)run;
+ (void)test;
@end
@implementation Person
+ (void)test
{
NSLog(@"Person+test");
}
- (void)run
{
NSLog(@"person---跑");
}
- (void)setAge:(int)age
{
_age = age;
}
- (int)age
{
return _age;
}
@end
// 不允许子类和父类拥有相同名称的成员变量
// Student
@interface Student : Person
{
int _no;
// int _age;
}
+ (void)test2;
@end
@implementation Student
// 重写:子类重新实现父类中的某个方法,覆盖父类以前的做法
- (void)run
{
NSLog(@"student---跑");
}
+ (void)test2
{
[self test];
}
@end
int main()
{
[Student test2];
// Student *s = [Student new];
//
// [s run];
return 0;
}