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

 

本节通过创建一个新的类,对以下知识点做下练习:

  (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的人在吃

   

人生之路,不忘初心,勿忘始终!
原文地址:https://www.cnblogs.com/xdl745464047/p/3996114.html