黑马程序员-[OC]学习之旅-封装、继承

来源:互联网 发布:icq聊天软件下载 编辑:程序博客网 时间:2024/05/18 11:46

类方法的概述:

+表示类方法,就是类调用方法,不依赖任何对象的方法

-表示对象方法,只能对象调用,依赖于任何对象的方法

类的使用注意事项:

类方法可以和实例方法同名,实例方法有实例对象访问调用,类方法要通过类里访问调用。

类方法也可以是从父类继承而来,子类可以重写类方法,

类方法和实例方法一样在interface 里声明,在implementation里实现

类方法只能被类调用执行,向实例对象发送类方法是不能被触发执行的

在类方法里使用了self,self执行的类对象是class object 而不是实例对象instance object

类方法中易犯的错误

在类方法中使用了类成员变量


匿名对象

[Person  new]

调用方法:[Persn new] run];

优点:可以简化代码,方便方法调用

缺点:匿名对象实例化以后,只能正确的使用成员变量

Person  *p = [[Person alloc] init];

Person  *P1 =[Person new];

alloc 和init分别把分配内存和初始化的工作分开,先分配内存,然后调用类的构造函数


封装:

本质是:把数据隐藏起来,只能用此类的方法函数才可以访问或者设置数据,降低数据的无用的可能型

原理:

实例变量默认只能被当前类的对象方法访问

步骤:定义设置实例变量(setter)方法和访问实例变量(getter)方法


setter设置器

set方法的作用:提供外接一个设置成员变量值的方法

命名规范:

方法名以set开头

是对象方法,只能由对象调用

返回值一定是void

一定要接收一个参数,而且参数类型需要和成员变量的类型一致

形参名不能和成员变量名一样

set方法的好处:不让数据暴露在外,保证数据的安全性

对设置的数据进行过滤

-(void)setAge:(int)age;声明

-(void)   setAge:(int)age{ 实现

_age  = age;

}


getter方法(访问器)

get 的作用:为调用者返回对象内部的成员变量

命名规范:一定有返回值,返回值的类型和成员变量的类型一致

方法名和成员变量名一样

不需要接收任何参数

-(int)  age;声明

-(int)age{

return_age;

}


对象和对象的关系:

组合模式:

把具有相同基类类型的对象组合到树形结构中,表示部分-整体的层次结构

依赖关系:

A对象作为B对象的局部变量或是方法形参,

[p  feedDog:dog];

关联关系:当一个对象拥有另一个对象的时候

当B对象为A对象的成员变量的时候,B对象与A对象之间存在一种关联关系

其耦合度高于依赖关系



重载:OC中 没有严格的方法的重载

OC中的重载是参数个数不同,但返回类型后面的名字相同。或者是参数的个数相同,但是其标签不相同

-(void)test:(int) intValue;

-(void)test:(int) intValue: andAge:(int) age;



static关键字使用

static修饰局部变量:延长局部变量的生命周期

全局变量:当前变量只能在当前文件中使用

修饰函数:函数只能在当前问文件中使用

注意:static不能修饰实例变量

static不能修饰对象方法



self和super关键字的介绍

super 发送消息可以将方法实现分发其父类。可以重写一个已有的方法来修饰或将他添加到现有方法中,仍然可以将原始的方法纳入到修改后的方法中

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


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

self 修饰变量在对象方法中可以利用self ->属性名称的方式访问成员变量

当存在局部变量名和成员变量名同名的时候


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

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

self在类方法中,self就代表类

[self 方法名称];调用其他方法(类方法\对象方法)



继承::

注意点:基类的私有能被继承,但是不能被使用

OC中继承是但继承的:也就是说一个类只能一个父类,不能继承多个父类

方法的重写:

从父类继承的方法,可能这个方法并不适合子类,可以再在类中重写父类的 方法;

可以使用[super 方法名],调用父类的方法

继承的注意事项:

子类不能定义和父类同名的变量,但是可以继承父类的变量

OC类支持单一继承,不支持多继承

OC中类支持多层继承

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

1、在自己类中找

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

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

4、如果父类的父类没有,就还往上找,知道基类(NSObject)

5、如果NSObject也没有就报错


实例变量修饰符:

@public (公开的)在有对象的前提下,任何地方都可直接访问。

@protected(受保护的)只能在当前类和子类的对象方法中访问

@private(私有的)只能在当前类中使用

@package(框架级别的)作用域介于私有和公开之间,只要处于同一个框架中就可以直接通过变量名访问

<span style="font-size: 18px;">@interface  Person :NSObject{      @private       int age;       @public       NSString *name;       @protected       NSString *sex; }</span>


在@interface  @end之间声明的成员变量如果不做特别的说明,默认是Protected的


OC中私有变量

在类.m@implementation中也可以声明成员变量,但是不在头文件中,所以在其他类中导入头文件的时候,并不能使用这个成员变量

在类的声明中用@private 关键字修饰,那么该变量只能在本类中使用,可以被继承,但是不可以被访问。
在类的声明中用@protected 关键字修饰,该变量只能在本类和子类中使用
在类扩展中定义的成员变量,是私有的
在.m文件中定义的变量,是纯私有的变量,不能被继承,也不能被访问。
利用@property 生成的下划线实例变量也是属于纯私有的。

description方法及重写

description方法默认返回对象的描述信息(默认实现是类返回类名和对象的内存地址)

NSLog(@"%@",objectA);会自动调用objectA 的Description方法来输出ObjectA 的描述信息

重写description方法

view plaincopy

  1. -(NSString *)description{
  2. return  [NSString stringWithFormat:@"年龄:%d",age);  
  3. }  
  4. +(NSString *){
  5. description{return @“重写description”;
  6. }  

注意:千万不能在对象description方法中同时使用%@和self

  1. -(NSString *)description{
  2. return [NSString stringWithFormat:@"%@",self];
  3. }
  4.   //同时使用了%@和self,代表要调用了self 的descriptiona方法,程序进入死循环


0 0
原创粉丝点击