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类的声明部分的代码:
第三步:类的实现(实现@interface中声明的方法)
这里我们假定方法内容为:"多少岁多少公斤的人在吃"和"多少岁多少公斤的人在跑"
写出Person类的实现部分的代码:
第四步:创建对象
1>使用[Person new]可以创建出一个对象,这里完成了3件事情:a.分配存储空间 b.初始化成员变量 c.返回空间地址
2>OC中,只能通过指针间接操作对象的成员变量/实例变量
下面写出main函数代码:
综上,可以得到完整的代码如下:
编译、链接、运行,输出结果为:
![](http://images.cnitblog.com/blog/676365/201409/271051153103457.png)
2、成员变量/实例变量赋值的练习
分析并说出以下代码段的输出结果:
分析: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的人在跑
分析:只对对象的一个成员变量进行了赋值,另一个没有赋值。这时没有赋值的成员变量就会使用new方法默认初始化的值0。
因此输出结果为:20岁,0.0kg的人在跑
0岁,50.0kg的人在吃
(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]; }
编译、链接、运行,输出结果为:
![](http://images.cnitblog.com/blog/676365/201409/271051153103457.png)
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的人在吃
相关文章推荐
- 黑马程序员---【OC语言】04面向对象之继承与多态
- OC-对象和方法的练习
- 【Objective-C】04-OC对象成员变量的封装规范:get方法和set方法
- OC基础-类和对象深入理解04
- java程序练习:尝试创建一个父类,在父类中创建两个方法,在子类中覆盖第二个方法,为子类创建一个对象,将他向上转型到基类并调用这个方法。
- 第05天OC语言(09):多个对象内存管理练习实现
- OC基础 - 04 类与对象
- 第05天OC语言(08):多个对象内存管理练习分析
- 第02天OC语言(04):结构体作为对象属性
- OC-04值对象
- 第01天OC语言(04):面向对象基本概念
- JAVA面向对象练习04
- Java编程思想 第4版 练习题 / 第2章 一切都是对象 / 练习5
- 学习数组类时,碰到typeof(),对其实验引起的一连串知识点、学习小结和思考练习(涉及成员对象变量、成员常量、抽象类Type等知识)
- 持有对象 练习12
- Java编程思想 第4版 练习题 / 第2章 一切都是对象 / 练习3
- Java编程思想 第4版 练习题 / 第2章 一切都是对象 / 练习8
- [零基础学JAVA]Java SE面向对象部分-09.面向对象基础(04)
- Java编程思想 第4版 练习题 / 第2章 一切都是对象 / 练习4
- 持有对象 练习12