黑马程序员---iOS--面对对象的语法

来源:互联网 发布:java path设置方法技巧 编辑:程序博客网 时间:2024/06/06 01:18

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

一、     set方法和get方法

1.         set方法和get方法的使用场合

@public的成员可以被随意赋值,应该使用set方法和get方法来管理成员的访问

(类似机场的安检、水龙头过滤,过滤掉不合理的东西),比如僵尸的生命值不能为负数

2.         set方法

1)      作用:用来设置成员变量的值,可以在方法里面加一些条件判断用来过滤掉一些不合理的值

2)      命名规范:

Ø  方法都是以set开头,而且后面跟上成员变量名,成员变量名的首字母必须大写

Ø   形参名称不要跟成员变量同名

3.         get方法

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

2)      命名规范:get方法的名称一般就跟成员变量同名

4.         成员变量的命名规范

Ø   成员变量都以下划线 _ 开头

Ø   可以跟get方法的名称区分开

Ø   可以跟其他局部变量区分开,一看到下划线开头的变量,肯定是成员变量

5.         代码示例

#import <Foundation/Foundation.h>// 声明@interface Car: NSObject{    int _wheels; //轮子个数}/*set方法*/- (void)setWheels:(int)wheels;/*get方法*/- (int)wheels;@end @implementation Car//set方法的实现- (void)setWheels:(int)wheels{    // 对外面传进来的轮子数进行过滤    if (wheels<=0)    {        wheels = 1;    }       _wheels = wheels;} //get方法的实现- (int)wheels{    return _wheels;}@end


6.         封装的好处

Ø   过滤不合理的值

Ø   屏蔽内部的赋值过程

Ø   让外界不必关注内部的细节

7.         练习

1>    Dog类,属性:weight、speed,方法:吃、跑

2>    Person类,属性:dog、age,方法:喂狗、遛狗

没有用get方法,set方法

////  main.m//  wenti2////  Created by apple-mac on 15/6/25.//  Copyright (c) 2015年 ludong. All rights reserved.//#import <Foundation/Foundation.h>@interface Dog : NSObject{    @public  //错误提醒学过c++的同学容易写成(public:)    int _weight;    int _speed;}- (void)run;- (void)eat;@end@implementation Dog- (void)run{    NSLog(@"这是run方法。");}- (void)eat{    NSLog(@"这是eat方法。");}@end@interface Person : NSObject{    @public    Dog* _dog; //提醒必须为指针    int _age;}- (void)liuDog;- (void)weiDog;@end@implementation Person- (void)liuDog{    NSLog(@"遛狗啦,狗的速度是:%d",_dog->_speed);}- (void)weiDog{    NSLog(@"喂狗啦,狗的体重时:%d",_dog->_weight);}@endint main(int argc, const char * argv[]) {    Dog *dog = [Dog new];    dog->_speed = 100;    dog->_weight = 50;    [dog run];    [dog eat];    Person *per = [Person new];    per->_age = 10;    per->_dog = dog;    [per liuDog];    [per weiDog];    return 0;}

使用get方法,set方法:

#import <Foundation/Foundation.h>@interface Dog : NSObject{    int _weight;    int _speed;}- (void)setWeight:(int)num;- (int)weight;- (void)setSpeed:(int)num;- (int)speed;- (void)run;- (void)eat;@end@implementation Dog- (void)setWeight:(int)num{    _weight = num;}- (int)weight{    return _weight;}- (void)setSpeed:(int)num{    _speed = num;}- (int)speed{    return _speed;}- (void)run{    NSLog(@"这是run方法。");}- (void)eat{    NSLog(@"这是eat方法。");}@end@interface Person : NSObject{    Dog* _dog;    int _age;}- (void)setDog:(Dog *)dog;- (Dog *)dog;- (void)setAge:(int)age;- (int)age;- (void)liuDog;- (void)weiDog;@end@implementation Person- (void)setDog:(Dog *)dog{    _dog = dog;}- (Dog *)dog{    return _dog;}- (void)setAge:(int)age{    _age = age;}- (int)age{    return _age;}- (void)liuDog{    NSLog(@"遛狗啦,狗的速度是:%d",[_dog speed]);}- (void)weiDog{    NSLog(@"喂狗啦,狗的体重时:%d",[_dog weight]);}@endint main(int argc, const char * argv[]) {    Dog *dog = [Dog new];    [dog setSpeed:100];    [dog setWeight:50];    [dog run];    [dog eat];    Person *per = [Person new];    [per setAge:10];    [per setDog:dog];    [per liuDog];    [per weiDog];    return 0;}

 错误提示:

 error: Semantic Issue: Interface type cannot be statically allocated

出现这个错误的原因是

接口声明对象时(我这么一说,大家应该懂我意思吧),必须声明为引用,即指针


二、     类方法

1.     基本概念

直接可以用类名来执行的方法(类本身会在内存中占据存储空间,里面有类\对象方法列表)

2.     类方法和对象方法对比

1)      对象方法

Ø  以减号-开头(对象方法只能被对象调用

Ø  只能让对象调用,没有对象,这个方法根本不可能被执行

Ø  对象方法能访问实例变量(成员变量)

 

2)      方法

Ø  以加号+开头

Ø  只能用类名调用,对象不能调用

Ø  类方法中不能访问实例变量(成员变量)

Ø  使用场合:当不需要访问成员变量的时候,尽量用类方法

3)      类方法和对象方法可以同名

3.     示例

Ø   设计一个方法输出类名

 

#import <Foundation/Foundation.h>@interface Car : NSObject+ (NSString *)name;- (NSString *)name;@end@implementation Car+ (NSString *)name{    return NSStringFromClass([Car class]);}- (NSString *)name{    return NSStringFromClass([self class]);}@endint main(int argc, const char * argv[]) {    Car *c = [Car new];    NSLog(@"%@",[Car name]);    NSLog(@"%@",[c name]);    return 0;}

三、     self关键字

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

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

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

2.     使用细节

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

2)    作用

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

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

3.     常见错误

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

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

Ø   self死循环

4.     示例

 

四、     习题

1.      设计Car类,一个对象方法跟其他车子比较车速,返回速度差,一个类方法比较两辆车的车速,返回速度差

#import <Foundation/Foundation.h>// 类的声明@interface Car : NSObject{@public    int wheels; // 多少个轮子    int speed; // 时速}- (void)run; // 跑的行为- (int)compare:(Car *)car1; //比较车速+ (int)compare:(Car *)car1 andOtherCar:(Car *)car2;@end@implementation Car- (void) run{    NSLog(@"%i个轮子,%i时速的车子跑起来了", wheels, speed);}- (int)compare:(Car *)car1{    return self->speed-car1->speed;}+ (int)compare:(Car *)car1 andOtherCar:(Car *)car2{    return car1->speed-car2->speed;}@endint main(int argc, const char * argv[]) {    Car *c1 = [Car new];    c1->wheels = 4;    c1->speed = 150;    Car *c2 = [Car new];    c2->wheels = 4;    c2->speed = 200;    NSLog(@"%d",[c1 compare:c2]);    NSLog(@"%d",[Car compare:c1 andOtherCar:c2]);    return 0;}

一、     继承

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);}@endl   有相同的属性和行为,抽出一个父类Animal(先抽取weight属性,再抽取eat方法)// Animal的声明@interface Animal : NSObject{    @public       int weight;}- (void)eat;@end// Animal的定义@implementationAnimal- (void)eat{    NSLog(@"吃吃吃-体重:%d",weight);}@endl   子类在父类的基础上拓充属性和方法// Bird的声明@interfaceBird : Animal{    @public        intheight;}- (void)fly;@end // Bird的定义@implementationBird- (void)fly{    NSLog(@"飞飞飞-高度:%d",height);}@end // Dog的声明@interface Dog: Animal{    @public        intspeed;}- (void)run;@end// Dog的定义@implementation Dog- (void)run{    NSLog(@"跑跑跑-高度:%d",speed);}@end


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

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

l   父类的静态方法

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

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

 

2.     继承的专业术语

l   父类\超类  superclass

l   子类  subclass\subclasses

 

3.     继承的细节

l   单继承

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

l   方法的重写

 

4.     super关键字

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

5.     继承的好处

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

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

l   抽取了公共代码

l   坏处:耦合性强

6.     继承的使用场合

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

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

二、     多态

1.多态的基本概念

l   某一类事物的多种形态

l   OC对象具有多态性

2.多态的体现

Person *p = [Student new];p->age = 100;[p walk];


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

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

3.多态的好处

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

4.多态的局限性

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

5.多态的细节

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

三、     NSString的简单使用

1.         字符串的快速创建

NSStirng *str = @“Hello”;

2.         使用静态方法创建

3.         使用%@输出字符串

NSString *name = @”mj”;

NSLog(@“我的名字是%@”,  name);



0 0