self只能在方法中使用;不要使用self来调用函数,也不可以在函数内部使用self;
使用self调用本方法,产生死循环
+ (
void
)openFlahlight
{
NSLog
(
@"
打开闪光灯
"
);
// NSLog(@"self = %p", self);
// 死循环
[selfopenFlahlight];// 死循环
}
self的使用场景
使用场景
:
可以用于在对象方法之间进行相互调用
可以用于在类方法之间进行相互调用
可以用于区分成员变量和局部变量同名的情况,用self->访问的就是成员变量,而不是局部变量
继承
基类的私有属性能被继承,不能在子类中访问
OC中的继承是单继承
子类父类方法重名,子类可以重写方法,调用的时候是使用子类的方法,如果想使用父类的方法,用super关键字
子类不能重复定义父类已经存在的成员变量,即使是父类私有的,子类私有的也不可以
super在类方法中,就会调用父类的类方法;在对象方法中就会调用父类的对象方法
多态(多态中必须要有继承)
很多动物都需要人来喂养,人类中不可能定义太多的真多不同动物的方法来接收动物,并且完成喂养的动作,这样,在人类里面直接定义动物类来接收,注意:
想要这个动物类能接收具体的动物,那么这些具体的动物都要继承动物类
代码:
主函数:
#import
#import
"Dog.h"
#import
"Cat.h"
#import
"Animal.h"
#import
"Person.h"
#import
"Pig.h"
int
main(
int
argc,
const
char
* argv[]) {
Dog
*d = [
Dog
new
];
Cat
*c = [
Cat
new
];
Pig
*p = [
Pig
new
];
//
创建三个对象
[
Person
food
:d];
[
Person
food
:c];
[Personfood:p];//人类调用类方法food,传入三个对象
return
0
;
}
Person.h
// Person.h
// day13
//
// Created by xiaomage on 15/6/19.
// Copyright (c) 2015
年
xiaomage. All rights reserved.
//
#import
#import
"Dog.h"
#import
"Cat.h"
@interface
Person :
NSObject
/*
+ (void)food:(Dog *)dog;
+ (void)foodCat:(Cat *)cat;
//
骆驼
//
狗熊
//
豹子
//
大象
//
猴子
//
鸡
//
猪
//
草泥马
// ...
*/
+ (
void
)food:(
Animal
*)a;
//
只写一个方法
,
别的动物可以直接往里面塞了
@end
// Person.m
// day13
//
// Created by xiaomage on 15/6/19.
// Copyright (c) 2015
年
xiaomage. All rights reserved.
//
#import
"Person.h"
@implementation
Person
+ (
void
)food:(
Animal
*)a
{
[a
eat
];
}
@end
// Pig.h
// day13
//
// Created by xiaomage on 15/6/19.
// Copyright (c) 2015
年
xiaomage. All rights reserved.
//
#import
#import
"Animal.h"
@interface
Pig :
Animal
@end
// Pig.m
// day13
//
// Created by xiaomage on 15/6/19.
// Copyright (c) 2015
年
xiaomage. All rights reserved.
//
#import
"Pig.h"
@implementation
Pig
- (
void
)eat
{
NSLog
(
@"
大口吃
"
);
}
@end
注意:
Animal *a1 = [Dog new];
[a1 eat];//调用的是父类特有的方法
//
注意点:在多态中,如果想调用子类特有的方法必须强制类型转换为子类才能调用
// [a1 kanJia];
Dog *d1 = (Dog *)a1;//强制类型转换
[d1 kanJia];//这样就可以调用狗特有的方法
注意:
在多态中,父类可以访问子类特有的方法———— 强制类型转换
假设 子类 Dog 有一个特有的方法bark
[dog bark];
Animal *an2 = [Dog new];
[(Dog*)an2 bark]; //把父类的指针,强制类型转换
*如果不存在多态,也就是说父类子类之间没有继承关系,是不能这么操作的
实例变量的修饰符