[03]类和对象

来源:互联网 发布:java redis maven 编辑:程序博客网 时间:2024/05/11 14:09

以Car为例:

1、类的声明和实现

//类的声明@interface Car {}@end//类的实现@implementation Car@endint main(){    return 0;}

2、对象的创建

#import<Foundation/Foundation.h>//类的声明@interface Car : NSObject//(继承语法):NSObject使得类具有创建对象的能力{}@end//类的实现@implementation Car@endint main(){    Car *p = [Car new];//利用类来创建对象:[行为执行者 行为名称]    return 0;}

3、对象的行为

区分函数和对象行为:
都作为功能:
①函数:C语言中 void run();
②行为:OC中 - (void)run;
都有三要素:名称、参数、返回值

#import<Foundation/Foundation.h>//类的声明@interface Car : NSObject//(继承语法):NSObject使得类具有创建对象的能力,所以需要包含头文件{}- (void)run;@end//类的实现(定义)@implementation Car- (void)run{    NSLog(@"Car is running!");}@endint main(){    Car *p = [Car new];//利用类来创建对象:[行为执行者 行为名称],在使用类创建对象之前,会将类加载进内存    [p run];//消息机制:给指针p所指的对象发送一条run消息    return 0;}

理解:消息机制

4、成员变量及其赋值

#import<Foundation/Foundation.h>//类的声明@interface Car : NSObject{    int speed;//属性(成员变量、实例变量:默认会初始化为0)    int wheels;}- (void)run;@end//类的实现(定义)@implementation Car- (void)run{    NSLog(@"Car is running!");}@endint main(){    Car *p = [Car new];    [p run];    return 0;}

5、方法与成员变量

#import<Foundation/Foundation.h>//类的声明@interface Car : NSObject{    @public//①如果没有这句代码,会怎么样呢?    int speed;//属性(成员变量、实例变量:默认会初始化为0)    int wheels;}- (void)run;@end//类的实现(定义)@implementation Car- (void)run{    NSLog(@"Car is running!");    NSLog(@"speed is %dkm/s, the car has %d wheels",     speed, wheels);}@endint main(){    Car *p = [Car new];    [p run];    p->speed = 120;    p->wheels = 3;    return 0;}

对于①,如果没有,则:instance variable ‘speed’ is protected
输出结果是:speed is 0km/s, the car has 0 wheels,证明了它会默认为0

利用上面的知识点,看看下面这个程序:

#import<Foundation/Foundation.h>@interface Person : NSObject{    @public    double weight;    int age;}- (void)sing;@end@implementation Person- (void)sing{    NSLog(@"\aThere is a(an) %d-year-old girl singing under the tree.She's %lf kg", age, weight);}@endint main(){    Person *p1 = [Person new];    p1->weight = 45.2;    [p1 sing];    Person *p2 = [Person new];    p2->age = 22;    [p2 sing];    return 0;}

There is a(an) 0-year-old girl singing under the tree.She’s 45.200000 kg
There is a(an) 22-year-old girl singing under the tree.She’s 0.000000 kg

6、对象的简单内存分析

(1)类中有方法列表
(2)每个对象内部默认都有一个isa指针(作用:指向对象所指向的类),这样看来:每个对象都在共用方法,但是访问成员变量是访问对象内部的成员变量(每个对象的都不相同)

方法列表在类中,成员变量在各对象内部

7、对象与函数参数

#import<Foundation/Foundation.h>@interface Person : NSObject{    @public    double weight;    int age;}- (void)sing;@end@implementation Person- (void)sing{    NSLog(@"\aThere is a(an) %d-year-old girl singing under the tree.She's %lf kg", age, weight);}int changeNum(double w, int a){    w = 55;    a = 99;    return 0;}@endint main(){    Person *p = [Person new];    p->weight = 45.2;    p->age = 22;    changeNum(p->weight, p->age);    [p sing];    return 0;}

值传递
There is a(an) 22-year-old girl singing under the tree.She’s 45.200000 kg

#import<Foundation/Foundation.h>@interface Person : NSObject{    @public    double weight;    int age;}- (void)sing;@end@implementation Person- (void)sing{    NSLog(@"\aThere is a(an) %d-year-old girl singing under the tree.She's %lf kg", age, weight);}int changeNum(Person *changeP){    changeP->weight = 55;    changeP->age = 99;    return 0;}@endint main(){    Person *p = [Person new];    p->weight = 45.2;    p->age = 22;    changeNum(p);    [p sing];    return 0;}

更改了实例变量
There is a(an) 99-year-old girl singing under the tree.She’s 55.000000 kg

#import<Foundation/Foundation.h>@interface Person : NSObject{    @public    double weight;    int age;}- (void)sing;@end@implementation Person- (void)sing{    NSLog(@"\aThere is a(an) %d-year-old girl singing under the tree.She's %lf kg", age, weight);}int changeNum(Person *changeP){    Person *p1 = [Person new];//①    p1->weight = 999.99;    p1->age = 999;    changeP = p1;    changeP->age = 100000000;    return 0;}@endint main(){    Person *p = [Person new];//②    p->weight = 45.2;    p->age = 22;    changeNum(p);    [p sing];    return 0;}

There is a(an) 22-year-old girl singing under the tree.She’s 45.200000 kg
结果没改变,为什么?
从①和②看出,p和p1是共用方法不互干扰的两个独立对象,即:p1的属性不影响p
虽然在调用函数时将p地址传给changeP,由于没有进行操作,p属性没有改变,但后来changeP指向p1,改变的也只是p1中的实例变量,下面通过实例,看看是不是这样的

#import<Foundation/Foundation.h>@interface Person : NSObject{    @public    double weight;    int age;}- (void)sing;@end@implementation Person- (void)sing{    NSLog(@"\aThere is a(an) %d-year-old girl singing under the tree.She's %lf kg", age, weight);}int changeNum(Person *changeP){    Person *p1 = [Person new];    p1->weight = 999.99;    p1->age = 999;    changeP = p1;    changeP->age = 111;    NSLog(@"p1->weight = %lf, p1->age = %d", p1->weight, p1->age);//重点    return 0;}@endint main(){    Person *p = [Person new];    p->weight = 45.2;    p->age = 22;    changeNum(p);    [p sing];    return 0;}

2015-11-13 00:04:22.215 a.out[876:89224] p1->weight = 999.990000, p1->age = 111
2015-11-13 00:04:22.216 a.out[876:89224] There is a(an) 22-year-old girl singing under the tree.She’s 45.200000 kg

0 0
原创粉丝点击