黑马程序员———OC基础语法(二)---三大特性

来源:互联网 发布:apache虚拟主机别名 编辑:程序博客网 时间:2024/06/01 19:22

        ------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------


一、封装

    

     更加接近人类的思考方式;

    只需要关注对象,不需要关注步骤。

函数和方法都是代码段的封装:

方法主要分两种:

对象方法:

1.减号 “-”开头;

2.只能由对象调用;

3.对象方法中能访问当前对象的成员变量;

    例: - (void)test;

类方法:

1.类方法都是以 “+”开头

2.对象只能调用对象方法,不能调用类方法;

3.类只能调用类方法,不能调用类方法;

例: + (void)test1;

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

1.不依赖于对象,执行效率高;

2.能用类方法尽量使用类方法;

3.场合:当方法内部不需要使用成员变量时,就可以改为类方法;

    

工具类:基本没有任何成员变量,里面的方法基本都是类方法。

注:类方法可以和对象方法同名。 

self(关键字):self是指针,

               指向了方法调用者,代表着当前对象。

self的的用途:

 1.概念:指向了当前对象\类(方法调用者);

 2.在对象方法中可以利用"self->成员变量名" 来访问当前对象内部的成员变量;

 3.[self 方法名] 可以调用其他对象方法\]类方法;

相当于java中的this指针。

 

二、继承

: 类名,继承了该类,相当于拥有了该类里面的所有的成员变量和方法。

oc中,不允许子类和父类拥有相同名称的成员变量,java中可以。

重写:子类重新实现父类中的某个方法,覆盖父类以前的做法。

注意:

1.父类必须声明在子类的前面;

2.子类不能拥有和父类相同的成员变量;

3.调用某个方法时,优先去当前类中找,如果找不到,去父类中找。

  

继承的使用场合:

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

2.当A类拥有B类中的部分属性和方法时,可以考虑让B类继承A类;

3.继承: 子类名 是 父类名(这话要符合逻辑思维)。   

      当子类名 不是 父类名 时,选用组合:子类 拥有 父类(符合逻辑思维)。

继承的好处:

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

2.建立了类与类之间的联系;

3.抽取了公共代码;

继承的坏处:耦合性太强。

super(关键字)

super的作用:

1.直接调用父类中的某个方法

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

      Super处在类方法中,那么就会调用父类的类方法; 

3.  使用场合:子类重写父类的方法是想保留父类的一些行为。

三、多态

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

例:  Animal *a = [Dog new];

父类指针访问对应的属性和方法,调用方法时会检测对象的真实形象。

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

好处:如果参数中使用的是父类类型,可以传入父类、子类对象

      例: void feed(Animal *a)

            { 

                [a eat];

            }

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

多态的局限性:父类类型的变量不能用来调用子类的特有方法编译有警告。

              可以考虑强制转换:

               例:  Animal *aa = [Dog new];

                    Dog *dd = (Dog *)aa; //类似基本数据的强制转换

注:没有继承就没有多态。

四、NSString(字符串类)

最简单的穿件字符串的方式:

NSString *str = @"itcast";

NSLog(@"我在n%@上课",str);

创建OC字符串的另一种方式:

int age = 15;

int no = 5;

NString *name = @"jack";

使用静态方法创建字符串的方式:

NSString *newStr = [NSString stringWithFormat:@"my age is %d and name is %@",age,name];

OC字符串是一个对象(可以用面向对象的方法操作字符串):

NSString *name = @"rose";

int size = [name length];//name.length;

注:length 方法算的是字数。 .length 默认输出 unsigend long 类型数据。

五、练习

类的合理设计:

   typedef enum{

    SexMan,

    SexWoman//名称里带上枚举类型名,比较容易识别,规范

} Sex;

typedef struct{

   int year;

   int month;

   int day;

} Date;

  

typedef enum{

  ColorBlack,

  ColorRed,

  ColorGreen

} Color;

/*

学生

成员变量:性别、生日、体重、最喜欢的颜色、狗(体重、毛色、吃、跑)

方法:吃、跑、遛狗、喂狗

*/

#import <Foundaation/Foundation.h>

@interface Dog :NSobject

{

   @public

   Color curColor;

   double weight;   

}

  - (void)run;

  - (void)eat;

@end

@implementation Dog

   - (void)eat;

{

 weight+=1;

 NSLog(@"狗吃完这次后的体重是%f",weight);

}

 - (void)run

{

  weight-=1;

  NSLog(@"狗跑完这次后的体重是%f",weight);

}

@end

@interface Student : NSobject

{

  @public

  Sex sex;

  Date birthday;

  double weight;

  Color favColor;

  char *name 

 //重点 OC中所有对象都是指针

  Dog *dog;

  

}

- (void)eat;

- (void)run;

void)print;

- (void)weigou;

- (void)liugou;

@end

@implementation Student

  - (void)eat;

{

 weight+=1;

 NSLog(@"学生吃完这次后的体重是%f",weight);

}

 - (void)run

{

  Weight-=1

  NSLog(@"学生跑完这次后的体重是%f",weight);

}

- (void)print

{

  NSLog(@"性别=%d,最喜欢的颜色=%d,姓名=%s,生日=%d-%d-%d",sex,favColor,name,birthday.year,birthday.month,birthday.day);

}

- (void)weigou

{

  //让狗吃东西(调用狗的eat方法)

   [dog eat];

}

- (void)liugou

{//让狗跑起来(调用狗的run方法)

    [dog run]

}

@end

int main()

{

 Student *s=[Student new];

 Dog *d=[Dog new];

 d->weight=30;

 d->curColor=ColorGreen;

 s->dog=d

 [s liugou];

 [s weigou];

 s->weight=50;

 s->sex=SexMan;

 //s->birthday ={2011,9,10};这种写法是错误的,在定义的同时才能初始化

 Date d={2011,9,10}//先定义一个变量并且初始化

 s->birthday=d

/*

  s->birthday.year=2011;

  s->birthday.month=9;

  s->birthday.day=10;

  这样写比较麻烦

*/

  s->name="rose";

  s->favColor=ColorBlack;

  [s eat];//51

  [s eat];//52

  [s run];//51

  [s run];//50 

return 0;

}

类方法 计算器:

/*

设计一个计算器类

求和

求平均值

*/

#import <Foundation/Foundation.h>

//工具类:基本没有任何成员变量,里面的方法基本都是类方法

@interface JiSuanQi : NSobject

//求和

- (int)sumWithNum1:(int)num1 andNum2:(int)num2;

//求平均值

- (int)averageWithNum1:(int)num1 andNum2:(int)num2;

@end

@implementation JiSuanQi

- (int)sumWithNum1:(int)num1 andNum2:(int)num2

{

  return num1+num2;

   

}

- (int)averageWithNum1:(int)num1 andNum2:(int)num2

{

    int sum = [JiSuanQi sumWithNum1:num1 andNum2:num2];

     

    return sum/2;

      

}

@end

int main()

{

   int a = [JiSuanQi sumWithNum1:10 andNum2:20];

   NSLog(@"a=%d",a);

   int b = [JiSuanQi averageWithNum1:10 anNum2:30];

   NSLog(@"b=%d",b);

  

   return 0;



0 0
原创粉丝点击