//--------依赖关系:
A对象作为B对象的局部变量或是方法形参的,B依赖与A,这时候我们称A与B之间存在一种依赖关系
1.car对象作为方法形参
人坐车回家
[person goHome:car];
2.car对象作为局部变量
-(void)goHome{
Car *car = [Car new];
[car run];
}
[person goHome];
//--------关联关系
当一个对象拥有另外一个对象的时候, 当B对象为A对象的成员变量的时候,B对象与A对象之间存在一种关联关系
关联关系是面向对象中最常用一种关系
@interface Person : NSObject
{
Dog *_dog; //关联关系
}
Person *person = [Person new]; 1.2.初始化 对象类型 nil
[person liuDog];
-(void)liuDog{
[_dog run]; // [nil run];
}
注意:
别忘了给_dog写set/get方法,new默认初始化为null
//---------
在一个方法里,如果要找对象,没找到,怎么办?
1.new一个对象 ----依赖关系
2.作为方法参数传一个对象进来 ----依赖关系
3.对象作为另一个对象的实例变量 ---关联关系
理解:关联关系的耦合度要高于依赖关系
编程方向: 低耦合,高内聚
//------------------文档安装和方法重载:
1. 在线安装
xcode-> 系统偏好设置->Doucument->下载
2. 离线安装
第三方软件:dash
3. 方法重载: 是指在一个类中定义多个同名的方法,参数类型不同
"OC中没有方法的重载"
-(void)run; // run
-(void)run:(int)speed; // run:
-(void)run:(float)speed; // run:
关键点:
找方法名,方法名不允许相同
编译器检查方法 只要检测到方法名相同就会报 方法名重名的错误
//---------------static关键字:
1. 在c语言中 static可以修饰
局部变量(延长局部变量的生命周期)、
全局变量(当前变量只能再当前文件中使用)
函数 (当前函数只能再当前文件中使用)
2. 在OC中, 不能用来修饰实例变量和方法, 但是可以修饰局部变量, 全局变量
//-------------------self的理解
self和super:
self理解:自己 简单理解: 谁调用当前方法, self就代表谁.
super代表的是父类.(简单理解) ....
super 父类 (超类) ...
self的使用
1)用在对象方法
2)用在类方法
3)访问实例变量
self的学习方法
在不同的地方self代表
//-----------------self使用在对象方法
若以%@打印对象 <类名 : 这个对象的地址> //对象的描述信息
Person *p = [Person new];
%@ ---> p ----> 对象p的描述信息
%p -----> p -----> 地址
在对象方法中,self代表的是调用当前方法的对象,只有对象才可以调用对象方法
self用在对象方法中,self就代表调用这个方法的对象(方法的调用者)
中午思考练习:
{
int _age;
int name;
}
-(void)setAge:(int)age{
_age = age;
}
-(void)setName:(int)name{
self->name = name; //可以的
self.name = name; // self.name 点语法 . 死循环 set / get 不可以的
}
实例变量_age 的 setter方法
-(void)age:(int)age{
_age == self->_age
self->age = age;
}
//----------------self使用在类方法中
在类方法中, self代表的是当前类,只有类名才可以调用类方法.
//------先知道,明天再具体分析
获取当前对象的类:
Person *p = [Person new]; //Person是一个类型 也是一个类类型的对象
[p class] == [Person class] == Person(类名)
返回当前类
若以%@打印对象 <类名 : 这个对象的地址> //对象的描述信息
%@打印类对象/类 类名
//---------------self访问成员变量
在对象方法中可以通过 self->_speed访问成员变量.
-(void)run:(int)age{
//self 现在在哪里 对象
self->age = age;
}
//-----------------self调用方法
// self 代表什么
+ self 当前类
- self 对象
[self 方法名称]; (类方法/对象方法)
注意:
在对象方法中不要使用self调用自身方法
在类方法中不要使用self调用自身方法
//--------------继承和派生:
建立继承关系:
1.导入头文件
2.修改声明文件
@interface 类名:父类名
@end
#特点: 子类拥有父类的所有属性跟方法 (除了私有属性跟私有方法)
派生: 父类向下产生子类的过程称为派生
派生类拥有基类的属性和方法,还有自己派生的新增的属性和方法
基类: 最初始最基本的类 (父类)
派生类: 子类
"继承是面向对象思想的一个特性,是一种思想"
派生类拥有基类的属性和方法,还有自己派生的新增的属性和方法
# 方法重写:把父类的方法,在子类中重新给实现了
重写父类的方法不需要写声明
super 对象方法 ----> 调用这个方法的对象的"父类对象"
super 类方法 -----> 当前类的"父类"
继承的注意事项:
1. 子类不能定义和父类同名的变量,但是可以继承父类的变量
2. OC类支持单一继承,不支持多继承
3. OC类支持多层继承
//-----------------继承体系中方法调用的顺序
1、在自己类中找
2、如果没有,去父类中找
3、如果父类中没有,就去父类的父类中
4、如果父类的父类也没有,就还往上找,直到找到基类(NSObject)
5、如果NSObject都没有就报错了
关于"重写父类方法"的一个细节:
1.子类重写父类的方法,相当于在调用该方法的时候覆盖了父类的方法,所以子类调用该方法,只会执行重写的方法,不会执行父类的方法
2.如果在子类重写的方法中调用父类的方法,使用super
//-------------实例变量修饰符:
作用范围:
@public(公开的) : 作用于所有的类 // 函数也适用 main()
@protected(受保护的): 作用于当前类,子类(派生类) //默认
@private(私有的): 作用于当前类 (子类不可用)
@package(框架级别的): 作用于框架级别的
父类
@private
.h 声明了 属性 修饰成子类不可用 但是 属性的本质还是公开的
//-----------
没有在.h中声明 直接在.m中写 属性的本质 : 私有
子类
不能用
能继承
//---------
不能用
不能继承
// ------------------ 私有属性 / 私有方法
"什么是私有属性和私有方法"
1.凡事没有声明,直接实现的 就是私有方法
2.实例变量写在实现中,没有声明 就是私有属性
"私有属性何私有方法怎么用"
3.私有属性 只能在 当前类的实现文件中使用
4.私有变量 只能在 当前类的实现文件中使用(间接的调用私有方法,借助公开的方法)
"私有属性与私有方法与子类"
5.私有属性和私有方法 不能被子类继承,没有继承就意味着子类没有拥有父类的属性与方法
"技巧------->"
6. xcode智能提示 智能提示出现---> 意味着这个对象拥有这个实例变量/方法
智能提示出现但是有红线 ---> 意味着这个对象拥有这个实例变量但是不能使用
智能提示没有出现 ---> 意味着这个对象没有这个实例变量和方法
//--------------私有变量&私有方法
私有实例变量:
@implementation <#class#>
{
//定义实例变量 ----> 私有实例变量 只能在本类中使用
}
私有方法:
直接在.m文件中实现,没有声明
私有变量跟私有方法不能被子类继承,私有方法与私有实例变量只能在本类中使用
@end
//--------------私有变量&私有方法:
默认情况下实例变量属于@protected修饰.
私有变量定义格式:
在.m文件当中定义
@implementation Person : NSObject
{
int age; // 私有变量
}
// 不在.h文件中声明, 只在.m文件中实现
-(void)run{
NSLog(@"我是私有方法");
}
@end
私有方法只能在当前文件中使用, 不能被子类继承.
实现中 .m 中使用
-(void)study{
[self run];
}
//私有方法
-(void))run{
}
|