黑马程序员-IOS-OC基础-面向对象语法三

来源:互联网 发布:java jdk版本查看 编辑:程序博客网 时间:2024/05/01 20:56

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

self关键字

1.    成员变量和局部变量同名

Ø   当成员变量和局部变量同名时,采取就近原则,访问的是局部变量

Ø   用self访问成员变量,区分同名的局部变量

2.    使用细节

1)    出现的地方:所有的OC方法中(对象方法\类方法),不能出现在函数

2)    作用

Ø   使用 "self->成员变量名"访问当前方法调用的成员变量

Ø   使用 "[self 方法名];"来调用方法(对象方法\类方法)

3.    常见错误

Ø   低级错误:用self去调用函数

Ø   类方法中用self调用对象方法,对象方法中用self调用类方法

Ø   self死循环

#import <Foundation/Foundation.h>@interface Person : NSObject{    int _age;}- (void)setAge:(int)age;- (int)age;- (void)test;@end@implementation Person- (void)setAge:(int)age{    // _age = age;    self->_age = age;}- (int)age{    return self->_age;}- (void)test{    // self:指向了方向调用者,代表着当期对象    int _age = 20;    NSLog(@"Person的年龄是%d岁", self->_age);}@endint main(){    Person *p = [Person new];        [p setAge:10];        [p test];        return 0;}

#import <Foundation/Foundation.h>/* self的用途: 1> 谁调用了当前方法,self就代表谁 * self出现在对象方法中,self就代表对象 * self出现在类方法中,self就代表类  2> 在对象方法利用"self->成员变量名"访问当前对象内部的成员变量  2> [self 方法名]可以调用其他对象方法\类方法 */@interface Dog : NSObject- (void)bark;- (void)run;@end@implementation Dog- (void)bark{    NSLog(@"汪汪汪");}- (void)run{    [self bark];    //NSLog(@"汪汪汪");    NSLog(@"跑跑跑");}@endint main(){    Dog *d = [Dog new];        [d run];        return 0;}

/* 设计一个计算器类 * 求和 * 求平均值 */#import <Foundation/Foundation.h>// 工具类:基本没有任何成员变量,里面的方法基本都是类方法@interface JiSusnQi : NSObject+ (int)sumOfNum1:(int)num1 andNum2:(int)num2;+ (int)averageOfNum1:(int)num1 andNum2:(int)num2;@end@implementation JiSusnQi+ (int)sumOfNum1:(int)num1 andNum2:(int)num2{    return num1 + num2;}+ (int)averageOfNum1:(int)num1 andNum2:(int)num2{    // 在这种情况下,self代表类    int sum = [self sumOfNum1:num1 andNum2:num2];    return sum / 2;}@endint main(){    int a = [JiSusnQi averageOfNum1:10 andNum2:12];        NSLog(@"a=%d", a);    //    JiSusnQi *jsq = [JiSusnQi new];//    //    //    [jsq sumOfNum1:10 andNum2:13];        return 0;}

self使用注意

<span style="font-size:14px;">#import <Foundation/Foundation.h>@interface Person : NSObject- (void)test;+ (void)test;- (void)test1;+ (void)test2;- (void)haha1;+ (void)haha2;@end@implementation Person- (void)test{    NSLog(@"调用了-test方法");        // 会引发死循环    //[self test];}+ (void)test{    NSLog(@"调用了+test方法");        // 会引发死循环    //[self test];}- (void)test1{    [self test]; // -test}+ (void)test2{    [self test]; // +test}- (void)haha1{    NSLog(@"haha1-----");}void haha3(){    }+ (void)haha2{    // haha3();    [self haha3];    // [self haha1];}@endint main(){    [Person haha2];    //Person *p = [Person new];        //[p test1];    return 0;}</span>

 继承

1.    继承的基本用法

l   设计两个类Bird、Dog


// Bird的声明@interface Bird : NSObject{    @public    int weight;}- (void)eat;@end// Bird的定义@implementation Bird- (void)eat {    NSLog(@"吃吃吃-体重:%d", weight);}@end// Dog的声明@interface Dog : NSObject{    @public    int weight;}- (void)eat;@end// Dog的定义@implementation Dog- (void)eat {    NSLog(@"吃吃吃-体重:%d", weight);}@end

l   有相同的属性和行为,抽出一个父类Animal(先抽取weight属性,再抽取eat方法)

// Animal的声明@interface Animal : NSObject{    @public        int weight;}- (void)eat;@end// Animal的定义@implementation Animal- (void)eat {    NSLog(@"吃吃吃-体重:%d", weight);}@end

l   子类在父类的基础上拓充属性和方法


<pre name="code" class="objc"><pre name="code" class="objc">// Bird的声明@interface Bird : Animal{    @public        int height;}- (void)fly;@end// Bird的定义@implementation Bird- (void)fly {    NSLog(@"飞飞飞-高度:%d", height);}@end// Dog的声明@interface Dog : Animal{    @public        int speed;}- (void)run;@end// Dog的定义@implementation Dog- (void)run {    NSLog(@"跑跑跑-高度:%d", speed);}@end



l   子类方法和属性的访问过程:如果子类没有,就去访问父类的

l   父类被继承了还是能照常使用的

l   父类的静态方法

l   画继承结构图,从子类抽取到父类

l   NSObject的引出:全部OC类的最终父类,包含了一些常用方法,比如+new

 

1.    继承的专业术语

l   父类\超类  superclass

l   子类  subclass\subclasses

 

2.    继承的细节

l   单继承

l   子类和父类不能有相同的成员变量

l   方法的重写

 

3.    super关键字

l   分别调用父类的对象方法和类方法

 

4.    继承的好处

l   不改变原来模型的基础上,拓充方法

l   建立了类与类之间的联系

l   抽取了公共代码

l   坏处:耦合性强

 

5.    继承的使用场合

l   它的所有属性都是你想要的,一般就继承

l   它的部分属性是你想要的,可以抽取出另一个父类

/*1.继承的使用场合 1> 当两个类拥有相同属性和方法的时候,就可以将相同的东西抽取到一个父类中 2> 当A类完全拥有B类中的部分属性和方法时,可以考虑让B类继承A类 A {    int _age;    int _no; }  B : A {    int _weight; }  // 继承:xx 是 xxx // 组合:xxx 拥有 xxx  2.组合 A {     int _age;     int _no; }  B {     A *_a;     int _weight; }*/@interface Score : NSObject{    int _cScore;    int _ocScore;}@end@implementation Score@end@interface Student : NSObject{    // 组合    Score *_score;//    int _cScore;//    int _ocScore;    int _age;}@end@implementation Student@end

  多态

1.多态的基本概念

l   某一类事物的多种形态

l   OC对象具有多态性

 

2.多态的体现

Person *p = [Student new];

p->age = 100;

[p walk];

l  子类对象赋值给父类指针

l  父类指针访问对应的属性和方法

 

3.多态的好处

l   用父类接收参数,节省代码

 

4.多态的局限性

l   不能访问子类的属性(可以考虑强制转换)

 

5.多态的细节

l   动态绑定:在运行时根据对象的类型确定动态调用的方法

#import <Foundation/Foundation.h>/* 多态 1.没有继承就没有多态 2.代码的体现:父类类型的指针指向子类对象 3.好处:如果函数\方法参数中使用的是父类类型,可以传入父类、子类对象 4.局限性: 1> 父类类型的变量 不能 直接调用子类特有的方法。必须强转为子类类型变量后,才能直接调用子类特有的方法 */// 动物@interface Animal : NSObject- (void)eat;@end@implementation Animal- (void)eat{    NSLog(@"Animal-吃东西----");}@end// 狗@interface Dog : Animal- (void)run;@end@implementation  Dog- (void)run{    NSLog(@"Dog---跑起来");}- (void)eat{    NSLog(@"Dog-吃东西----");}@end// 猫@interface Cat : Animal@end@implementation Cat- (void)eat{    NSLog(@"Cat-吃东西----");}@end// 这个函数是专门用来喂动画//void feed(Dog *d)//{//    [d eat];//}////void feed2(Cat *c)//{//    [c eat];//}//// 如果参数中使用的是父类类型,可以传入父类、子类对象void feed(Animal *a){    [a eat];}int main(){    // NSString *d = [Cat new];    // [d eat];        /*    Animal *aa = [Dog new];    // 多态的局限性:父类类型的变量 不能 用来调用子类的方法    //[aa run];        // 将aa转为Dog *类型的变量    Dog *dd = (Dog *)aa;        [dd run];    */        //Dog *d = [Dog new];        //[d run];        /*    Animal *aa = [Animal new];    feed(aa);        Dog *dd = [Dog new];    feed(dd);        Cat *cc = [Cat new];    feed(cc);     */        /*    // NSString *s = [Cat new];    Animal *c = [Cat new];            NSObject *n = [Dog new];    NSObject *n2 = [Animal new];            // 多种形态    //Dog *d = [Dog new]; // Dog类型        // 多态:父类指针指向子类对象    Animal *a = [Dog new];        // 调用方法时会检测对象的真实形象    [a eat];    */    return 0;}

NSString的简单使用

<span style="font-weight: normal;"><span style="font-size:14px;">#import <Foundation/Foundation.h>@interface Person : NSObject{    //char *_name;    NSString *_name;}@endint main(){    /*    // 最简单的创建字符串的方式    NSString *str = @"itcast";        char *name = "itcast";            NSLog(@"我在%@上课", str);    //NSLog(@"%s", name);    */        int age = 15;    int no = 5;    NSString *name = @"哈哈jack";    // length方法算的是字数    int size = [name length];        NSLog(@"%d", size);        // 创建OC字符串的另一种方式    NSString *newStr = [NSString stringWithFormat:@"My age is %d and no is %d and name is %@", age, no, name];            NSLog(@"---- %ld", [newStr length]);        return 0;}</span></span>



-------------------------------------- android培训java培训、ios培训期待与您交流! ---------------------------------
0 0
原创粉丝点击