黑马程序员——面向对象思想、设计类与创建对象、对象与函数、方法与函数、合理设计类

来源:互联网 发布:网站建设搜索优化 编辑:程序博客网 时间:2024/06/08 06:27

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


一、面向对象思想

1、面向对象与面向过程的区别

      举例说明:去饭店吃饭找服务员是面向对象;去饭店吃饭考虑先到达饭店然后点菜然后做菜然后做好菜然后开始吃这个过程的话就是面向过程。

       总结:面向过程关注的是解决问题需要哪些步骤;面向对象关注的是解决问题需要哪些对象。

一些常用术语:面向过程ProcedureOriented;面向对象Object Oriented,简称OO;面向对象编程Object Oriented Programming,简称OOP


2、类和对象

         举例说明:用图纸来设计车子,则图纸是类,车子是对象。OC中的相当于图纸,OC利用类来创建对象。面向对象解决问题应该是先考虑需要设计哪些类,再利用类创建多少个对象

 

3、设计类

 举例说明:设计人这个类,则类名:人(Person); 属性:身高(height)、年龄(age);  行为(功能):跑(run)、打架(fight)。

 一般名词都是类。拥有相同(或者类似)属性和行为的对象都可以抽像出一个类。

 注意:哪个对象最清楚这个行为,就把这个行为写到哪个对象中去。例如僵尸死了这个行为在僵尸这个对象中,不是向日葵。


二、第一个类——设计类和创建对象

1、类名书写规范

    类名的命名规范:类名的第一个字母必须是大写;不能有下划线;多个英文单词,用驼峰标识。


2、类的声明:


     @interface Car :NSObject //NSObject让这个类具有创建对象的能力。

{

//用来声明对象的属性(实例变量/成员变量属性默认为0)。

@public  //加上之后可以允许外部指针间接访问对象内部的变量。

int wheels;

int speed;

}

 //方法(行为):方法名,参数,返回值。放在interface和之间。

//只要是OC对象的方法都必须以减号-开头。

//OC方法中任何数据类型都必须要用小括号()括住。

-(void) run;

@end


3、类的实现:


@implementation Car

//方法的实现

NSLog(@"车子跑啊跑");

@end

 

4、用类来创建对象:


int main()

{

//oc中想执行一些行为,就写上一个中括号[行为执行者行为名称]

//执行一个类的new行为是用来创建新的对象。

//定义了一个指针变量p,p将指向car类型的对象.

//[car new]会创建出一个新对象,并且会返回新对象本身的地址。

    Car *p = [Car new];  

p->wheels = 4;   //p所指向对象的wheels属性赋值。       

p->speed = 250;

//p所指向对象发送一条run消息。

[p run];

NSLog("车子又%d个轮子",速度为:%d",p->wheels,p->speed);

return 0;

}


5、程序和输出结果


#import<Foundation/Foundation.h>@interface Car :NSObject{    @public    int wheel;    int speed;}-(void) run;@end@implementation Car-(void) run{    NSLog(@"我的小车跑啊跑");}@endint main(){    Car *c = [Car new];    c->wheel = 4;    c->speed = 100;    NSLog(@"我有辆车,它有%d个轮子,速度可以达到%dkm/h",c->wheel,c->speed);    [c run];}



 

 三、第二个类——在方法里面调用成员变量


1、实例分析


/*

类名:Person

属性(成员变量):身高,体重

行为(方法):走路

*/

/*类的声明

*成员变量

*方法的声明

*/

 

#import<Foundation/Foundation.h>

@interface Person : NSObject

{

@public

int age;

Double weight;

}

-(void)walk; 

@end

 

@implementation Person

-(void)walk

{

NSLog(@"%d,%fkg的人走到西天去取经"age,weight);

}

@end

 

int main()

{

Person *p =[Persom new];

p->age = 18;

p->weight =70; 

[p walk]; 

Person *p2 =[Persom new];

p2->age = 20;

p2->weight =60;

[p2 walk]; 

return 0;

}


2、程序和输出结果


/*人 类名:Person 属性(成员变量):身高,体重 行为(方法):走路 *//*类的声明 *成员变量 *方法的声明 */#import<Foundation/Foundation.h>@interface Person : NSObject{    @public    int age;    double weight;}-(void)walk;@end@implementation Person-(void)walk{    NSLog(@"一个%d岁,%fkg的人走到西天去取经",age,weight);}@endint main(){    Person *p = [Person new];    p->age = 18;    p->weight = 60;        [p walk];        Person *p2 = [Person new];    p2->age = 28;    p2->weight = 70;        [p2 walk];        return 0;}


四、第三个类——OC对象与函数

1、实例程序分析

 

#import <Foundation/Foundation.h>@interface Car : NSObject{// 成员变量@public    int wheels;    int speed;}- (void)run;@end@implementation Car- (void)run{    NSLog(@"%d个轮子,速度为%dkm/h的车子跑起来", wheels, speed);}@endvoid test(int w, int s){    w = 20;    s = 200;}void test1(Car *newC){    newC->wheels = 5;}void test2(Car *newC){    Car *c2 = [Car new];    c2->wheels = 5;    c2->speed = 300;        newC = c2;    newC->wheels = 6;}int main(){    Car *c = [Car new];    c->wheels = 4;    c->speed = 250;        //test(c->wheels, c->speed);    test1(c);   // test2(c);        [c run];        return 0;}

2、总结


   方法列表是所有对象共用的,其在类中。

   OC中的对象不能自动回收


五、常见错误总结


1、常见错误


只有类的声明,没有类的实现;漏了@end@interface@implementation嵌套;两个类的声明嵌套;成员变量没有写在括号里面;方法的声明写在了大括号里面

 

2、语法细节


成员变量不能在{}中进行初始化、不能被直接拿出去访问;方法不能当做函数一样调用;

成员变量\方法不能用static等关键字修饰,别跟C语言混在一起类的实现可用写在main函数的后面,主要在声明后面就行了。


3、类的声明和实现的关系

  

   @interface@implementation的分工

@interface就好像暴露在外面的时钟表面

@implementation就好像隐藏在时钟内部的构造实现

 

六、方法和函数的区别

1OC方法和函数的区别

   OC方法只能声明在@interface@end之间,只能实现在@implementation@end之间。也就是说OC方法不能独立于类存在

   C函数不属于类,跟类没有联系,C函数只归定义函数的文件所有

   C函数不能访问OC对象的成员

 低级错误:方法有声明,但是实现的时候写成了函数

 

2OC的方法注意


 方法只有声明,没有实现(经典错误)

 方法没有声明,只有实现(编译器警告,但是能调用,OC的弱语法)

 编译的时候:访问没有的成员变量直接报错,访问没有的方法,只是警告

 

七、类的合理设计

1、实例程序分析

 

typedef enum{    SexMan,    SexWoman}Sex;typedef struct{    int year;    int month;    int day;} Date;#import<Foundation/Foundation.h>@interface Dog : NSObject{@public    int weight;}- (void)run;- (void)eat;@end@implementation Dog- (void)run{    weight -=1;    NSLog(@"%d",weight);}- (void)eat;{    weight +=1;    NSLog(@"%d",weight);}@end@interface Student : NSObject{@public    Sex sex;    Date birthday;    Dog *dog;}- (void)liuDog;- (void)weiDog;@end@implementation Student- (void)liuDog{    [dog run];}- (void)weiDog{    [dog eat];}@endint main(){    Dog *d = [Dog new];    d->weight = 20;    Student *s = [Student  new];    s->dog = d;    [s weiDog];    [s liuDog];}


2、输出结果



3、总结


 如果在一个类的成员变量中有一个是另一个类的对象,则这个成员变量(对象)可以使用其类的方法,即跨类调用方法。





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


0 0
原创粉丝点击