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 */
  • 相关阅读:
    使用javap分析Java的字符串操作
    使用javap深入理解Java整型常量和整型变量的区别
    分享一个WebGL开发的网站-用JavaScript + WebGL开发3D模型
    Java动态代理之InvocationHandler最简单的入门教程
    Java实现 LeetCode 542 01 矩阵(暴力大法,正反便利)
    Java实现 LeetCode 542 01 矩阵(暴力大法,正反便利)
    Java实现 LeetCode 542 01 矩阵(暴力大法,正反便利)
    Java实现 LeetCode 541 反转字符串 II(暴力大法)
    Java实现 LeetCode 541 反转字符串 II(暴力大法)
    Java实现 LeetCode 541 反转字符串 II(暴力大法)
  • 原文地址:https://www.cnblogs.com/KevinBin/p/4967405.html
Copyright © 2011-2022 走看看