您的位置:首页 > 其它

04-类与对象的练习(第二个OC的类)

2014-09-27 10:48 155 查看
本节通过创建一个新的类,对以下知识点做下练习:

  (1)类的3要素

  (2)成员变量的声明、命名规则

(3)类的声明与实现

(4)创建一个对象,new方法执行的3步操作

(5)成员变量的赋值操作

1、创建一个人类,属性:年龄、体重,行为(方法):跑、吃

  第一步:分析类的3要素

    类名:Person(人类)

    属性:_age(年龄)、_weight(体重)

    行为(方法):run(跑)、eat(吃)

    这里 :表示的是继承关系,后面的笔记会谈及,这里只做简单了解

      类1 : 类2 表示的是 类1继承类2:类1是类2的子类,类2是类1的父类

      :NSObject 表示继承NSObject类,NSObject类是所有类的基类,它没有父类。  

  第二步:类的声明(@interface @end)

    类的声明又分为成员属性的声明和行为(方法)的声明

      1>成员属性的声明:

{}中用来声明对象属性;

以下划线_开头,例如_speed(速度),不以下划线开头不算错,但是行业规范是以下划线_开头;

在创建对象的时候,new方法会将成员变量/实例变量默认初始化为0;

遵循驼峰原则,例如 _seatNumber(座位号);

      2>方法(对象方法)的声明:

方法:方法名、参数、返回值(声明) ,不能写在{}中

对象方法必须以减号 - 开头;

OC方法中任何数据类型都必须用小括号()括起来,并且小括号()只能用来括住数据类型,不要乱用;

这里的数据类型包括返回值类型和参数数据类型

跟函数不同,方法的声明后面不需要{}  

      举例说明:

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

        1>以减号 - 开头,说明是对象方法

        2>方法名是 sumWithNum1: andNum2: 注意:冒号:也是方法名的一部分

        3>第一个int代表的是返回值类型,后面两个int分别代表参数num1和num2的数据类型,都用小括号()括住了

        4>方法的声明以末尾的分号;结束,后面不能再加{} 

下面写出Person类的声明部分的代码: 

#import <Foundation/Foundation.h>
@interface Person :NSObject
{
@public//可以让类的外部的指针访问到对象的成员变量/实例变量
int _age;//年龄
double _weight;//体重
}
//方法的声明
- (void)run;//跑
- (void)eat;//吃
@end


   第三步:类的实现(实现@interface中声明的方法)

这里我们假定方法内容为:"多少岁多少公斤的人在吃"和"多少岁多少公斤的人在跑"

写出Person类的实现部分的代码:

//Person类的实现
@implementation
//实现@interface中声明的方法
- (void)run
{
NSLog(@"%i岁,%.1fkg的人在跑");
}

- (void)eat
{
NSLog(@"%i岁,%.1fkg的人在吃");
}

@end


    第四步:创建对象

    1>使用[Person new]可以创建出一个对象,这里完成了3件事情:a.分配存储空间 b.初始化成员变量 c.返回空间地址

    2>OC中,只能通过指针间接操作对象的成员变量/实例变量

下面写出main函数代码:

int main(int argc, const char * argv[])
{
//利用Person类创建一个对象
Person *person1= [Perosn new];
//给person1所指向的对象的成员变量/实例变量赋值
person1 -> _age = 20;
person2 -> _weight = 50;
//person1调用对象方法run
[person1 run];
//person1调用对象方法eat
[person1 eat];
}


综上,可以得到完整的代码如下:

//1.类的声明
#import <Foundation/Foundation.h>
@interface Person : NSObject
{
@public
int _age;//年龄
double _weight;//体重
}
- (void)run;//跑
- (void)eat;//吃
@end

//2.类的实现
@implementation Person
//实现@interface中声明的方法
- (void)run
{
NSLog(@"%d岁,%.1fkg的在跑", _age, _weight);
}

- (void)eat
{
NSLog(@"%d岁,%.1fkg的人在吃", _age, _weight);
}

@end

int main(int argc, const char * argv[])
{
//在使用类创建对象之前,会将类加载进内存
//方法列表存放在类中
Person *person1 = [Person new];
person1 -> _age = 20;
person1 -> _weight = 50.0;
[person1 run];
[person1 eat];
}


编译、链接、运行,输出结果为:



2、成员变量/实例变量赋值的练习

分析并说出以下代码段的输出结果:

Person *person1 = [Person new];

person1 -> _age = 20;
person1 -> _weight = 50;

Person *person2 = person1;
person2 -> _age = 30;

[person1 run];


分析:1>第1行表示创建了一个对象1,并把对象1的地址赋值给指针变量person1,即person1指向对象1

   2>第3、4行给对象1的成员变量进行赋值,这时对象1的年龄为20,体重为50

   3>第6行定义一个新的指针变量person2,把person1赋值给它,那么person2也就指向了对象1

4>由于person2也指向了对象1,再对_age进行赋值,会把原先的赋值覆盖掉,因此这时对象1的年龄是30

5>第9行,调用对象方法,输出结果:30岁,50.0kg的人在跑

Person *person1 = [Person new];
person1 -> _age = 20;
[person1 run];

Person *person2 = [Person new];
person2 -> _weight = 50.0;
[person2 eat];


分析:只对对象的一个成员变量进行了赋值,另一个没有赋值。这时没有赋值的成员变量就会使用new方法默认初始化的值0。

   因此输出结果为:20岁,0.0kg的人在跑

0岁,50.0kg的人在吃

   
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: