本节通过创建一个新的类,对以下知识点做下练习:
(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类的声明部分的代码:
1 #import <Foundation/Foundation.h>
2 @interface Person :NSObject
3 {
4 @public//可以让类的外部的指针访问到对象的成员变量/实例变量
5 int _age;//年龄
6 double _weight;//体重
7 }
8 //方法的声明
9 - (void)run;//跑
10 - (void)eat;//吃
11 @end
第三步:类的实现(实现@interface中声明的方法)
这里我们假定方法内容为:"多少岁多少公斤的人在吃"和"多少岁多少公斤的人在跑"
写出Person类的实现部分的代码:
1 //Person类的实现
2 @implementation
3 //实现@interface中声明的方法
4 - (void)run
5 {
6 NSLog(@"%i岁,%.1fkg的人在跑");
7 }
8
9 - (void)eat
10 {
11 NSLog(@"%i岁,%.1fkg的人在吃");
12 }
13
14 @end
第四步:创建对象
1>使用[Person new]可以创建出一个对象,这里完成了3件事情:a.分配存储空间 b.初始化成员变量 c.返回空间地址
2>OC中,只能通过指针间接操作对象的成员变量/实例变量
下面写出main函数代码:
1 int main(int argc, const char * argv[])
2 {
3 //利用Person类创建一个对象
4 Person *person1= [Perosn new];
5 //给person1所指向的对象的成员变量/实例变量赋值
6 person1 -> _age = 20;
7 person2 -> _weight = 50;
8 //person1调用对象方法run
9 [person1 run];
10 //person1调用对象方法eat
11 [person1 eat];
12 }
综上,可以得到完整的代码如下:
1 //1.类的声明
2 #import <Foundation/Foundation.h>
3 @interface Person : NSObject
4 {
5 @public
6 int _age;//年龄
7 double _weight;//体重
8 }
9 - (void)run;//跑
10 - (void)eat;//吃
11 @end
12
13
14 //2.类的实现
15 @implementation Person
16 //实现@interface中声明的方法
17 - (void)run
18 {
19 NSLog(@"%d岁,%.1fkg的在跑", _age, _weight);
20 }
21
22 - (void)eat
23 {
24 NSLog(@"%d岁,%.1fkg的人在吃", _age, _weight);
25 }
26
27 @end
28
29
30 int main(int argc, const char * argv[])
31 {
32 //在使用类创建对象之前,会将类加载进内存
33 //方法列表存放在类中
34 Person *person1 = [Person new];
35 person1 -> _age = 20;
36 person1 -> _weight = 50.0;
37 [person1 run];
38 [person1 eat];
39 }
编译、链接、运行,输出结果为:
2、成员变量/实例变量赋值的练习
分析并说出以下代码段的输出结果:
1 Person *person1 = [Person new]; 2 3 person1 -> _age = 20; 4 person1 -> _weight = 50; 5 6 Person *person2 = person1; 7 person2 -> _age = 30; 8 9 [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的人在跑
1 Person *person1 = [Person new]; 2 person1 -> _age = 20; 3 [person1 run]; 4 5 Person *person2 = [Person new]; 6 person2 -> _weight = 50.0; 7 [person2 eat]; 8
分析:只对对象的一个成员变量进行了赋值,另一个没有赋值。这时没有赋值的成员变量就会使用new方法默认初始化的值0。
因此输出结果为:20岁,0.0kg的人在跑
0岁,50.0kg的人在吃