黑马程序员-oc面向对象特性

self使用方法

self用在对象方法中

self用在类方法中

self访问实例变量  self ->实例变量

谁调用当前方法   self就代表谁

 

self在类方法中使用,其指代的是当前类 

   self在对象方法中使用其指代的是调用当前方法的对象

注解:self使用总结

self 谁调用当前方法,self就代表谁

self 在对象方法中,self代表当前对象

self在类方法中,self代表类

 

 

 

selfsuper:

1. self理解:   谁调用当前方法, self就代表谁.

比如在对象方法中,self代表的是对象因为只有对象才可以调用对象方法

在类方法中self代表的是类因为只有类名才可以调用类方法.

 

注意在对象方法中不要使用self调用类方法

在类方法中不要使用self调用对象方法

 

2. 获取当前对象的类:  Person *p = [Person new];

[p class] = [Personclass] = Person

 

3. 在对象方法中可以通过 self->_speed访问成员变量.

 

4.  super代表的是当前类的父类.

 

static关键字:

1. c语言中 static可以修饰局部变量、全局变量、函数

2. OC, 不能用来修饰实例变量和方法, 但是可以修饰局部变量, 全局变量

 

继承

继承体系中方法调用的顺序:

1、在自己类中找

2、如果没有,去父类中找

3、如果父类中没有,就去父类的父类中

4、如果父类的父类也没有,就还往上找,直到找到基类(NSObject)

5、如果NSObject都没有就报错了

oc当中没有多继承  会用协议  分类来代替  

 

实例变量修饰符 :    用来判断实例变量的作用域 ,限制实例变量的作用范围

@public             公有的    所有文件都可以正常的访问使用  前提是需要包含头文件

@private           私有的  只有当前类可以访问   不能被子类访问(子类尅继承所有的实例变量和方法  但是  不是所有的都可以访问)

@protected     作用于当前类和子类   都可以访问     不能在其他类中使用

@package    作用于框架    不经常用

@interface@end之间实例变量中如果没有作特别的说明   默认的是@protected

 

 

oc中的私有变量

@implementation  类名

{

数据类型+变量名           

//这是一个私有的实例变量(全局的)   不能被子类继承   私有成员变量只有在当前文件中访问

 

}

 

oc中的私有方法(相对私有)

.m文件中实现,不需要在.h文件中声明   不能被子类继承  只有在当前文件中访问   在当前文件中可以调用

 

 

多态

1. 多态概念,定义

什么是多态:多态就是某一类事物的多种形态;

表现形式:  Animal *ani = [Dog new];

多态条件:1.有继承关系     2.有方法的重写

 

2.多态代码实现:

//实例化猫的对象

Animal *animal = [Cat new]; //父类的指针指向子类对象;

[animaleat];

 

//实例化狗的对象

animal = [Dog new]; //父类的指针指向子类对象。

    [animal eat];

 

3.多态注意点:

1) 如果存在多态,父类是可以访问子类特有的方法

假设子类Dog 有一个特有的方法bark

Animal *an2 = [Dog new];         //编译时看等号左边,运行时看等号右边

[(Dog*)an2 bark]; //把父类的指针,强制类型转换

 

2) 如果不存在多态,父类是不可以访问子类特有的方法的

Animal*an3 = [Animal new];

[(Dog*)an3 bark]; //错误的,不能强制转换

 

 

 

不同的对象以自己的方式响应相同名称的方法成为多态

表现形式为:父类指针指向子类对象   Animal *ani = [Cat new];

条件:方法的重写(子类把父类的同名方法重写)  有继承关系

优点:简化编程接口 

 

多态的注意点:编译的时候看左边的类型   运行的时候看右边

 

类对象

类的本质其实也是一个对象(类对象)

类对象运行时一直存在

类对象是一种数据结构,存储类的基本信息:类大小,类名称,类的版本以及消息与函数的映射表等

每一个对象都包含一个指向其类对象的isa指针

 

 

 

类对象的使用:

1)可以用来调用类方法

//获取类对象

Class c1 = [Personclass];

//使用类对象调用类方法

[c1 test]; //test是一个+号方法

 

创建实例对象   调用类方法 

类对象的获取方法:   类对象属于class类型 

1.通过实例对象来获取 2.通过类名来获取 

Dog *d = [dog new];

Class c = [d Class]//通过实例对象来获取

 

Class c1=  [Dog Class];

 

SEL

SEL是一种新的数据类型  id,class一样 

Person *p = [Person new];

SEL s1 = @selector(test);//test表示对象的方法   SEL包装方法 

[p  performSelector:s1];

 

点语法:

传统setter  getter方法

  • (void)setAge:(int)age;

{

_age = age

}

  • (int)age{

 

age

}

点语法:

本质上展开之后相当于调用setter,getter方法

P.age = 10;  等价于 [p setAge:10];

NSString*name = p.age; 等价于NSString *name = [p name]; // getter方法

 

对象. 成员变量   //展开之后到底是setter方法, 还是getter方法, 看在等号的左边还是右边,

如果是等号左边就是setter方法, 在等号右边是getter方法

点语法陷阱

set方法使用self.

- (void)setAge:(int)newAge{

    self.age = newAge;

}

点语法的本质是方法的调用,而不是访问成员变量,当使用点语法时,编译器会自动展开成相应的方法。

切记点语法的本质是转换成相应的setget方法,如果没有setget方法,则不能使用点语法。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值