zoukankan      html  css  js  c++  java
  • iOS 开发学习-类的创建与实现,与java语言的对比

    Person.h

      1 #import <Foundation/Foundation.h>
      2 
      3 @interface Person : NSObject
      4 {
      5     //在{}中定义属性(全局变量/实例变量)
      6     //注意:只能定义不能赋值,因为这里只是在做声明操作,不能赋值的
      7     //加上下划线,为了区分局部变量
      8     NSString *_name;//姓名,默认值是nil:空指针,可以查看定义:#define nil NULL
      9     NSInteger _age;//年龄,默认值是0
     10 }
     11 
     12 //定义方法
     13 //-:实例方法,+:类方法
     14 //格式:方法说明 (返回类型) 方法名 : (参数类型)参数名称
     15 //注意方法名是shopping:,不是shopping,这个要注意
     16 - (void)shopping:(float)price;
     17 
     18 //定义方法设置属性值(注意setXXX)
     19 - (void)setName:(NSString *)name;
     20 - (void)setAge:(NSInteger)age;
     21 
     22 //定义方法的获取属性值(注意不是getXXX,而是直接的属性名,因为getXXX在OC中还有其他用途)
     23 - (NSString *)name;
     24 - (NSInteger)age;
     25 
     26 //多个参数的方法定义
     27 //方法名两部分组成的:setName: setAge:
     28 - (void)setName:(NSString *)name setAge:(NSInteger)age;
     29 //或者方法名:setName: :,后面的可以省略,但是这种方式不建议使用
     30 //- (void)setName:(NSString *)name :(NSInteger)age;
     31 
     32 //类方法
     33 //在这个方法中是无法访问属性的,因为属性是属于对象的,不是类的
     34 + (Person *)newPerson;
     35 @end
     36 
     37 /*
     38 一般类的定义格式为:
     39 
     40 @interface 类名:NSObject{
     41 
     42 定义属性
     43 
     44 }
     45 定义方法(method)
     46 
     47 
     48 这里有几点需要说明:
     49 
     50 1、OC中任何一个类都是继承NSObject,这个和Java中的Object是一个概念的,所以这里需要导入
     51 
     52 #import <Foundation/Foundation.h>
     53 
     54 其实Java中的Object对象是在java.lang.*包中的,不过Java并不会导入这个包,因为Object类的类加载器决定的,不需要导入的.
     55 
     56 2、这里的继承符号和C++中是一样的,使用冒号:
     57 
     58 3、在{}类定义类的属性,关于这里所说的属性和Java中的属性不是一个概念了,OC中只要定义在{}中的字段就是类的属性,而Java中是有getXXX/setXXX的方法,才叫属性。
     59     同时也得注意,OC中类中定义的属性名是以下划线:"_"开头,为什么要这样做,就是为了区分后面的局部变量与其重名了,当然我们在Java中一般是以m开头,
     60     或者其他方式,Java中没有那么强的规范,但是OC中还是强烈建议用这种方式的,还有一点要注意,在定义设置方法的时候,一般样式是setXXX,
     61     但是在定义取值的方法的时候直接是XXX,而不是getXXX了,这个也是和Java有区别的,至于为什么这么做,因为get开头的方法已经有其他用处了,
     62     后面会说到。这里就注意一下就可以了。
     63 
     64 4、在属性定义的后面就是简单的定义方法了
     65 
     66 
     67 下面在来看一下如何定义方法:
     68 
     69 OC中定义方法和Java语言有很大的不同,所以这里很难记住,如果不常用的话,看一下方法的定义格式:
     70 
     71 方法说明 (返回类型) 方法名 : (参数类型)参数名称
     72 
     73 
     74 1、方法说明有两种:
     75 
     76 一种是减号:"-",表示该方法是对象方法,就是必须用对象实例才能调用的
     77 
     78 一种是加号:"+",表示该方法是类方法,就是可以用类直接调用的,不需要实例化对象的,类似于Java中的static方法
     79 
     80 2、返回类型:这个就简单了,和Java语言很类似了
     81 
     82 3、方法名:方法名和Java中就不太一样了,看个例子:
     83 
     84     //注意方法名是shopping:,不是shopping,这个要注意  
     85     - (void)shopping:(float)price;  
     86 
     87 这个方法的方法名是
     88 
     89 shopping: 是包含冒号的,再看个例子:
     90 
     91     //多个参数的方法定义  
     92     //方法名两部分组成的:setName: setAge:  
     93     - (void)setName:(NSString *)name setAge:(NSInteger)age;  
     94 
     95 多参数的方法定义,那么这个方法的方法名就是setName:setAge:
     96 
     97 4、(参数类型)参数名称:这个和Java也是有很大的区别的,感觉像是和Java中定义的相反了,他用括号把类型括起来了。OC中的对象类型和Java中的使用不一样,
     98     OC中的对象类型相当于C中指针定义样式(类名 *),这点需要注意。
     99 
    100 当然在类定义的结束地方使用@end关键字的
    101 */v

    Person.m

     1 #import "Person.h"
     2 
     3 @implementation Person
     4 
     5 //实现方法
     6 - (void) shopping : (float)price{
     7     NSLog(@"%@ shopping %f",_name,price);
     8 }
     9 
    10 - (void)setName:(NSString *)name{
    11     _name = name;
    12 }
    13 - (void)setAge:(NSInteger)age{
    14     _age = age;
    15 }
    16 - (NSString *)name{
    17     return _name;
    18 }
    19 - (NSInteger)age{
    20     return _age;
    21 }
    22 - (void)setName:(NSString *)name setAge:(NSInteger)age{
    23     _name = name;
    24     _age = age;
    25 }
    26 + (Person *)newPerson{
    27     return [[Person alloc] init];
    28 }
    29 
    30 @end
    31 
    32 /*
    33 看到类的实现使用的是@implementation 关键字
    34 
    35 在实现的源文件中,必须导入类的定义的头文件
    36 
    37 #import "Person.h"
    38 这样的一种形式,和C语言中的工程结构非常相似。
    39 
    40 然后就是对头文件中定义的一些方法的具体实现了,而且在实现文件中,我们可以访问类中定义的属性。
    41 
    42 其他的就没有什么难度了,就不在细说了,同样的类的结束标志:@end
    43 */

    main.m

      1 //类的定义放在.h文件中
      2 //类的实现放在.m文件中
      3 
      4 //定义一个类的步骤
      5 //定义类名、编写类的属性、编写类的行为
      6 
      7 #import <Foundation/Foundation.h>
      8 
      9 #import "Person.h"
     10 
     11 int main(int argc, const char * argv[]) {
     12     @autoreleasepool {
     13         //创建对象
     14         //在内存中申请一块内存区域
     15         //Person *person = [Person alloc];
     16         //调用初始化方法,初始化一些默认数据
     17         //可能上面申请的内存之前有被使用过,还会有以前的数据。所以我们需要将其数据清空,这时候就会将默认值进行赋值(相当于清空操作)
     18         //person = [person init];
     19         
     20         //合并
     21         //这里申请了两块内存:一个是对象指针变量,一个是alloc申请的
     22         //可以看出alloc/init方法是类方法、可以查看NSObject对象的定义
     23         Person *person = [[Person alloc] init];
     24         
     25         //还有另外的一种方式创建一个对象,但是这种方式不建议使用,因为这种方式相当于把上面的两个合并
     26         //有时候我们需要将上面的两个步骤进行分开操作的
     27         //Person *person1 = [Person new];
     28         
     29         //设置名字
     30         [person setName:@"jaingwei"];
     31         
     32         //调用实例方法shopping
     33         [person shopping:200];
     34         
     35         Person *person1 = [[Person alloc] init];
     36         [person1 setName:@"huangdaoyang"];
     37         [person1 shopping:300];
     38         //同时设置两个属性的值,但是这种方式不建议使用,建议使用set方法
     39         [person1 setName:@"huangdaoyang" setAge:22];
     40         
     41         //get方法调用
     42         NSString *person_name = [person name];
     43         NSLog(@"name is %@",person_name);
     44         NSString *person1_name = [person1 name];
     45         NSLog(@"name is %@",person1_name);
     46         
     47         //类方法调用
     48         Person *person2 = [Person newPerson];
     49         [person2 setName:@"shixin" setAge:22];
     50         [person2 shopping:400];
     51         
     52         //空指针
     53         Person *person3 = nil;
     54         //不执行任何操作,但是也不会报错空指针异常
     55         [person3 setName:@"空对象" setAge:22];        
     56         
     57     }
     58     return 0;
     59 }
     60 /*
     61 OC中实例化一个对象的方式是:
     62     Person *person = [[Person alloc] init];
     63     
     64 首先是指针类型的样式定义一个变量,然后是调用类的alloc方法,接着调用init方法,这里有点比较奇怪,我们在定义Person类的时候,没有定义alloc和init方法,
     65 
     66     这里为什么不报错呢?这个就和Java很相似了,因为OC中任何类都是集成NSObject类的,那么自然想到了这两个方法是NSObject定义的。
     67 
     68     而且我们可以看到alloc方法是类方法,init是对象方法
     69 
     70 同时,OC中的方法调用方式:
     71 
     72 对象方法:[对象变量  方法名 参数]
     73 
     74 类方法:[类名  方法名 参数]
     75 
     76 这里实例化一个对象和Java中有很大的区别的,Java中直接new一个就可以了。这里需要调用两个方法alloc和init
     77 
     78 可以这么理解吧:alloc相当于给这个对象分配内存空间,init是调用这个类的构造方法,对属性和字段进行初始化操作
     79 
     80 当然上面的实例化操作也可以变成两步:
     81 Person *person = [Person alloc];
     82 //调用初始化方法,初始化一些默认数据
     83 //可能上面申请的内存之前有被使用过,还会有以前的数据。所以我们需要将其数据清空,这时候就会将默认值进行赋值(相当于清空操作)
     84 person = [person init];
     85 但是OC中建议的方式还是上面那种。
     86 
     87 对象方法的调用,设置名字:
     88 //设置名字
     89 [person setName:@"guojianhao"];
     90 
     91 多个参数的对象方法调用,同时设置名字和年龄
     92 //同时设置两个属性的值,但是这种方式不建议使用,建议使用set方法
     93 [person1 setName:@"huangdaoyang" setAge:22];
     94 
     95 类方法的调用:
     96 //类方法调用
     97 Person *person2 = [Person newPerson];
     98 
     99 总结
    100 
    101 好了,关于OC中类的定义以及实现,如何使用就介绍到这里了,我们在学习的过程中可以和一门面向对象语言相比较学习,这样可能会学习的快点。
    102 */
  • 相关阅读:
    RDMA技术详解(二):RDMA Send Receive操作
    RDMA技术详解(一):RDMA概述
    Fedora中制作UEFI/BIOS启动的U盘安装盘
    Fedora中制作BIOS启动的U盘安装盘
    chkdsk /f
    单片机原理及应用---实验计划
    LeetCode 645. Set Mismatch(错误的集合)
    LeetCode 401. Binary Watch(二进制手表)
    LeetCode 852. Peak Index in a Mountain Array(山脉数组的峰顶索引)
    LeetCode 518. Coin Change 2(零钱兑换 II)
  • 原文地址:https://www.cnblogs.com/KevinBin/p/4967405.html
Copyright © 2011-2022 走看看