[黑马程序员]13[OC语言]OC三大特性部分学习笔记总结

------- android培训java培训IOS培训、期待与您交流! ----------



OC三大特性

 

1.    封装

01. 基本语法

 

//set方法:成员变量的封装

 

#import <Foundation/Foundation.h>

 

@interface Student :NSObject

{

    //@public 以后写成员变量除特殊情况,统统不许写@public

    int age;

}

 

- (void)study;

 

//提供一个方法给外界设置age属性值

//set方法

//1>作用:提供一个方法给外界设置成员变量值,可以在方法里对输入范围进行约束

//2>命名规范:1.必须以set开头

//2.set后面跟上成员变量的名称,成员变量的首字母必须大写

//3.返回值一定是void

//4.一定要接收一个参数,而且参数类型与成员变量一致

//5.形参的名称不能跟成一团变量名称一样

 

- (void)setAge:(int)age;

 

//提供一个方法给外界获取age属性值

//get方法

//1.作用:返回对象内部的成员变量

//2.命名规范

//1>肯定有返回值,而且返回值类型与成员变量类型一致

//2>方法名跟成员变量名一致

//3>不需要接收任何参数

 

- (int)age;

 

@end

 

 

@implementation Student

 

- (void)setAge:(int)newAge

{

    if(newAge <=0)

    {

        newAge =1;

    }

    age = newAge;

}

 

- (int)age

{

    returnage;

}

 

- (void)study

{

    NSLog(@"%d岁的学生在学习",age);

}

 

@end

 

02. 对象方法,成员变量

 

//成员变量的命名规范:一定要以_开头

//作用:

//1>让成员变量和get方法的名称区分开

//2>可以跟局部变量分开,一看到下划线开头的变量,一般都是成员变量

 

typedefenum {

    SexMan,

    SexWoman

} Sex;

 

@interface Student :NSObject

{

    int _no;

    Sex _sex;

}

 

- (void)setSex:(Sex)sex;

- (Sex)sex;

 

- (void)setNo:(int)no;

- (int)no;

 

@end

 

 

@implementation Student

 

- (void)setSex:(Sex)sex

{

    _sex = sex;

}

 

- (Sex)sex

{

    return_sex;

}

 

- (void)setNo:(int)no

{

    _no = no;

}

 

- (int)no

{

    return_no;

}

 

@end

 

03. 类方法

 

//对象方法:

//1>-开头

//2>只能由对象来调用

//3>对象方法恩能够访问当前对象的成员变量

 

//类方法:

//1>+开头

//2>只能由类来调用

//3>实例变量不能在类方法中访问

 

 

//类方法的好处和使用场合

//1>不依赖于对象,执行效率高

//2>能用类方法尽量用类方法

//3>场合:当方法内部不需要使用到成员变量

 

@interface Person :NSObject

 

//类方法:加号开头 放在类的储存空间里

//某些情况下把经常使用且不改变的方法设定为类方法可以提升效率

+ (void)printClassName;

 

@end

 

@implementation Person

 

+ (void)printClassName

{

    NSLog(@"这个类叫做Person");

}

 

@end

 

 

int main()

{

    Person *p = [Personnew];//由类调用的方法

   

    //[p test];//由对象调用的方法

   

    [PersonprintClassName];

   

    return0;

}

 

//

//  main.m

//  OC三大特性-01-封装-07类方法练习

//

//  Created by apple on 15-4-8.

//  Copyright (c) 2015apple. All rights reserved.

//

 

#import <Foundation/Foundation.h>

 

//设计一个计算器类

 

@interface JiSuanQi :NSObject

 

+ (int)sumOfNum1:(int)num1 andNum2:(int)num2;

 

+ (int)averageOfNum1:(int)num1 andNum2:(int)num2;

 

@end

 

 

@implementation JiSuanQi//工具类,不需要用到成员变量,改为类方法

 

+ (int)sumOfNum1:(int)num1 andNum2:(int)num2

{

    return num1 +num2;

}

 

+ (int)averageOfNum1:(int)num1 andNum2:(int)num2

{

    //功能封装,这样写方便代码重构

    int sum = [JiSuanQisumOfNum1:num1andNum2:num2];

   

    return sum/2;

}

 

@end

 

 

int main()

{

    int a = [JiSuanQisumOfNum1:10andNum2:6];

   

    int b = [JiSuanQiaverageOfNum1:10andNum2:6];

   

    NSLog(@"%d\t%d",a,b);

   

    return0;

}

 

 

 

2.    继承

01. 继承的好处

 

//继承的好处:

//1>抽取重复代码

//2>建立了类之间的关系

//3>子类可以拥有父类中得所有成员变量和方法

 

//2注意点

//1>基本上所有的类都是继承于NSObject这个根类

 

@interface Animal :NSObject

{

    int _age;

    double _weight;

}

 

- (void)setAge:(int)age;

- (int)age;

 

- (void)setWeight:(double)weight;

- (double)weight;

 

@end

 

 

@implementation Animal

 

- (void)setAge:(int)age

{

    _age = age;

}

 

- (int)age

{

    return_age;

}

 

- (void)setWeight:(double)weight

{

    _weight = weight;

}

 

- (double)weight

{

    return_weight;

}

 

@end

 

//************************************************

@interface Dog :Animal //继承了Animal,拥有了Animal的所有成员变量和方法

//Animal称为Dog的父类,Dog称为Animal的子类

 

@end

 

 

@implementation Dog

 

@end

 

 

//************************************************

@interface Cat :Animal

 

@end

 

 

@implementation Cat

 

@end

 

//

int main()

{

    Dog *d = [Dognew];

   

    [d setAge:10];

   

    NSLog(@"age=%d",[dage]);

   

    return0;

}

 

 

02. 使用注意

 

//基本上每个对象里有一个isa指针,指向对应的类

//每个类里有一个superclass指针,指向对应的父类

//类里储存的是方法列表,包含+的类方法和-的对象方法

 

#import <Foundation/Foundation.h>

 

//注意点:

//1>父类必须写在子类的前面

//2>子类不能拥有与父类相同的成员变量

//3>调用某个对象方法的时候,优先取当前对象中找,找不到逐层去父类中找

 

//坏处:

//耦合性太强,如果父类被删了,子类就废了

 

@interface Person :NSObject

{

    int _age;

}

 

- (void)setAge:(int)age;

- (int)age;

 

- (void)run;

 

@end

 

@implementation Person

 

- (void)setAge:(int)age

{

    _age = age;

}

 

- (int)age

{

    return_age;

}

 

- (void)run

{

    NSLog(@"Person->pao");

}

 

@end

 

//OC中不允许子类和父类拥有相同名称的成员变量

@interface Student :Person

{

    int _no;

    //错误int _age;

}

@end

 

@implementation Student

 

//方法名可以相同

//重写:子类重新实现父类的某个方法

//覆盖父类以前的做法

- (void)run

{

    NSLog(@"student->run");

}

 

@end

 

 

int main()

{

    Student *s = [Studentnew];

   

    [s run];//优先在Student中找run方法,没有->父类,没有->继续向上

   

    return0;

}

 

03. 继承与组合

 

//继承的使用场合;

//1>当两个类拥有相同属性和方法的时候,就可以将相同的东西抽取到一个父类中

//2>A类拥有B类的部分属性和方法时,可以考虑让B类继承A

 

//得符合人的逻辑

//继承:xxxxxx

//组合:xxx拥有xxx

 

//另一种做法:组合

@interface Score :NSObject

{

    int _cScore;

    int _ocScore;

}

 

@end

 

@implementation Score

 

@end

 

@interface Student :NSObject

{

    //得符合人的逻辑

    //继承:xxxxxx

    //组合:xxx拥有xxx

   

    Score *_score;

    //   int _cScore;

    //   int _ocScore;

    int _age;

}

 

@end

 

@implementation Student

 

@end

 

04. super

 

//super的作用

//1>直接调用父类中得某个方法

//2>super处在对象方法中,那么就会调用父类的对象方法

//  super处在类方法中,那么就会调用父类的类方法

//3>比较常见的使用场合:子类重写父类的方法时想保留一部分父类的内容

 

//植物大战僵尸

//僵尸类:

//跳跃僵尸,舞王僵尸,铁通僵尸等

 

@interface Zoombie :NSObject

 

- (void)walk;

 

- (void)test;

+ (void)test;

 

@end

 

@implementation Zoombie

 

- (void)walk

{

    NSLog(@"往前走两步");

}

 

- (void)test

{

    NSLog(@"haha");

}

+ (void)test

{

    NSLog(@"hahaha");

}

 

@end

 

 

//跳跃僵尸

@interface JumpZoombie :Zoombie

 

@end

 

@implementation JumpZoombie

- (void)walk

{

    NSLog(@"跳两下");

   

    //   NSLog(@"往前走两步");

    [superwalk];

    //super:调用父类的walk方法

}

 

@end

 

 

 

int main()

{

    JumpZoombie *jz = [JumpZoombienew];

   

    [jz walk];

   

    [JumpZoombietest];

   

    return0;

}

 

 

3.    多态

01. 基本

 

//多态:

 

//1>没有继承就没有多态

 

//2>代码的体现:父类类型的指针指向子类对象

 

//3>好处:如果函数/方法参数中使用的时父类类型,可以传入父类好子类对象

 

//4>局限性:父类类型的变量不能直接调用子类特有的方法,必须强转为子类类型变量后,才能调用

 

@interface Animal :NSObject

 

- (void)eat;

 

@end

 

@implementation Animal

 

- (void)eat

{

    NSLog(@"Animal eat---");

}

 

@end

 

//没有继承就没有多态

@interface Dog :Animal

 

- (void)run;

 

@end

 

@implementation Dog

 

- (void)eat

{

    NSLog(@"Dog eat-----");

}

 

- (void)run

{

    NSLog(@"run~~~~~~~~");

}

@end

 

//

@interface Cat :Animal

 

@end

 

@implementation Cat

 

- (void)eat

{

    NSLog(@"cat eat-----");

}

 

@end

 

//专门喂动物的函数

//void feed(Dog *d)

//{

//    [d eat];

//}

//

//void feed2(Cat *c)

//{

//    [c eat];

//}

 

//如果参数中使用的时父类类型,那么父类,子类对象都可以传入,避免函数0

 

//重写

void feed(Animal *a)//多态的好处

{

    [a eat];

}

 

 

int main()

{

    //多种形态

    //   Dog *d = [Dog new];//Dog类型

    //

    //   feed(d);

    //

    //   //多态:父类指针指向子类对象

    //   Animal *d1 = [Dog new];//动物形态

    //

    //   //这也是多态

    //   //NSObject *a = [Dog new];

    //

    //   [d eat];

    //

    //   [d1 eat];

    //

    //   //多态的使用注意:

    //   //由于OC的弱语法,这样写是可以正确赋值的,但是这样不符合人的逻辑,不要这样写

    //   //Cat *c = [Animal new];

    //   Animal *c = [Cat new];

    //

    //   feed(c);

    //

    //   [c eat];

   

    //多态的局限性:父类类型的变量,不能用来调用子类的方法

    Animal *aa = [Dognew];

   

    Dog *dd = (Dog *)aa;//得需要将aa强制转换为Dog*类型的变量

   

    [dd run];

   

    //Dog *d = [Dog new];

   

    //[d run];

   

    return0;

}

 

02. self语法

 

//self用途

//1>概念:指向了当前对象(方法调用者)

//*self出现在对象方法中,self就代表对象

//*self出现在类方法中,self就代表类

//2>可以利用"self->成员变量名"访问当前对象内部的成员变量

//3>[self方法名]可以调用其他对象方法活着类方法

 

//#import<Foundation/Foundation.h>

//

//@interface Dog :NSObject

//

//- (void)bark;

//- (void)run;

//

//@end

//

//

//@implementation Dog

//

//- (void)bark

//{

//    NSLog(@"wangwangwang");

//}

//

//- (void)run

//{

//    [self bark];

//

//    NSLog(@"pao");

//}

//

//@end

//

//

//

//int main()

//{

//    Dog *d = [Dog new];

//

//    [d run];

//

//    return 0;

//}

 

 

 

//self使用注意

 

#import <Foundation/Foundation.h>

 

@interface Person :NSObject

 

- (void)test;

 

+ (void)test;

 

- (void)test1;

 

+ (void)test2;

 

void test();

 

@end

 

 

@implementation Person

 

- (void)test

{

    NSLog(@"调用了-test方法");

   

    [selftest];//死循环

}

 

+ (void)test

{

    NSLog(@"调用了+test方法");

   

    [selftest];//死循环

}

 

- (void)test1

{

    [selftest];//-test

}

 

+ (void)test2

{

    [selftest];//+test

}

 

void test()

{

    printf("haha\n");

}

 

@end

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值