黑马程序员-类的声明与实现,方法与函数以及常见错误

来源:互联网 发布:阿尔法淘宝宝贝 编辑:程序博客网 时间:2024/06/16 03:28
---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------

/*

类名:Person

属性:(成员变量\实例变量):体重,年龄

行为(方法):走,吃

*/

#import <Foundation/Foundation.h>

//类的声明

//*成员变量 方法声明

@interface Person :NSObject

{

   @public

   int age;

   double weight;

}

-(void)walk;

-(void)eat;

@end

//类的实现

@implementation Person

//实现声明的方法

-(void)walk;

{

   NSLog(@"%d岁%f公斤的人走了一段路",age,weight);

}

-(void)eat;

{

   NSLog(@"%d岁%f公斤的人吃东西",age,weight);

@end

int main()

{

   /*

   //在使用类创建对象前,会将类加载进内存,而且只加载一次。

   Person *p1=[Person new];//每个对象都有个Isa指针指向类

   p1->age =20;

   p1->weight =50.0;

   [p1 walk];

  

   Person *p2=[Person new];//创建多个对象

   p2->age =30;

   p2->weight =53.5;

   [p2 walk];

   */

 

   //分别只设置一项

   Person *p1=[Person new];

   p1->age =20;

   Person *p2=[Person new];

   p2->weight =50.0;

   [p1 walk];//输出是20,0;

  

   //指针传递并修改属性

   Person *p1=[Person new];

   p1->age =20;

   p1->weight =50.0;

  

   Person *p2 =p1;//将p1的地址给p2

   p2->age =30;

   [p1 walk];

   /*

   Person *p1=[Person new];

   p1->age =20;

   p1->weight =50.0;

  

   Person *p2=[Person new];

   p2->age =30;

   p2->weight =53.5;

   p1=p2;//将p2内容给p1.p1指向p2对象,

   p1->age = 40;

   [p2 walk];//某个对象(p2)在做什么事(walk)

   */

   return 0;

 

}

 

面向对象封装的好处

更加接近人类的思考方式

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

 

#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);

}

@end

 

 

void test(int w, int s)//实质还是值传递

{

    w = 20;

    s = 200;

}

 

void test1(Car *newC)//内存分析认真听老师讲解,08对象与函数参数

{

    newC->wheels = 5;

}

 

void test2(Car *newC)//这段非常有意思,

{

    Car *c2 = [Car new];//oc对象创建就存在不像指针那样随着方法消失

    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;

}

类的声明和实现

@interface和@implementation的分工

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

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

 

常见书写错误

1.只有类的声明,没有类的实现

2. @interface后面漏了@end  造成了@interface和@implementation嵌套

两个类的声明嵌套

3.成员变量没有写在括号里面

4.方法的声明写在了大括号里面,或者写在实现@implementation里面

5.方法的实现在@interface下面

6.成员变量(也叫实例变量,就是说只有实例对象才能拥有的变量)不能在{}中进行初始化、不能被直接拿出去访问,默认为protect

7. 方法不能当做函数一样调用

8.成员变量\方法不能用static等关键字修饰,别跟C语言混在一起比如说:static int wheels.没有什么所谓的内部方法这个概念

9. 类的实现可用写在main函数的后面,主要在声明后面就行了

 

OC方法和函数的区别

 

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

C函数不属于类,跟类没有联系,C函数只归定义函数的文件所有,不依赖与对象。

C函数不能访问OC对象的成员,可以存在任意位置但是唯一不能存在于声明@interface@end之间,

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

 

OC的方法注意

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

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

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

 

没有@interface,只有@implementation,也是能成功定义一个类的

@implementation Car : NSObject

{

    @public

    int wheels; // 多少个轮子

    int speed; // 时速

}

- (void) run

{

    NSLog(@"%i个轮子,%i时速的车子跑起来了", wheels, speed);

}

@end

@implementation中不能声明和@interface一样的成员变量

---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------详细请查看:www.itheima.com
0 0
原创粉丝点击