Objective-C,是美国人布莱德·确斯(Brad Cox)于 1980 年年初发明的一 种程序设计语言,其与同时代的 C++ 一样,都是在 C 的基础上加入面向对象特性扩充而成的。Objective-C 最大的特点是支持面向对象编程OOP(Object Oriented Programming),其主要特性有封装,继承,多态.

既然是一门面向对象的编程语言,因此它也有类/对象,类方法/对象方法,成员变量等概念.

一 语法简介

1.

  类就是具有相同特征和行为(功能)事物的抽象,相当于是一种数据类型,只不过这种类型叫做类类型(Class Type),而对象就是使用这种类类型创建出来的变量,对象是类的实例化.

创建一个类相当于我们自己定义一种数据类型,使用这种数据类型创建出来的变量就叫做对象.

  在OC中,一般用2个文件来描述一个类:

  1> .h:类的声明文件,用于声明成员变量、方法。类的声明使用关键字@interface和@end。

注意:.h中的方法只是做一个声明,并不对方法进行实现。也就是说,只是说明一下方法名、方法的返回值类型、方法接收的参数类型而已,并不会编写方法内部的代码。

  2> .m:类的实现文件,用于实现.h中声明的方法。类的实现使用关键字@implementation和@end。

2. 方法

  方法就相当于C语言中的函数,只不过OC不再称之为函数,管它叫方法.

  1> 方法的声明和实现,都必须以 + 或者 - 开头

  • + 表示类方法(静态方法) 用加号 " + " 修饰的方法属于类方法,这个方法只能被这个类调用(也就是使用类名调用)
  • - 表示对象方法(动态方法) 用减号 " - " 修饰的方法属于对象方法,这个方法只能由当前类创建的对象调用

3. 成员变量

  成员变量的常用作用域有3种:

  1> @public 全局都可以访问

  2> @protected 只能在类内部和子类中访问

  3> @private 只能在类内部访问

二 有关类的代码解析

1.Person.h – 类的声明文件

#import <Foundation/Foundation.h> 
@interface Person : NSObject {
   // 实例变量
  @public
   NSString *_name;//姓名
   NSInteger _age;// 年龄
   NSString *_gender;// 性别
}
//这里定义三个方法:说话,吃饭和睡觉.
- (void)sayHello;
- (void)eat;
- (void)sleep;
@end

  a. @interface 接口的意思, Person 是类型名, 冒号:表示继承自谁, NSObject 是OC中所有类的基类,这些在创建完类以后系统会帮我们自动生成,不用手动书写代码.

  b. 大括号{}内写这个类的特征(也就是实例变量:即类的实例(对象)具有的属性),实例变量必须写到大括号里面

  c. @public  实例变量被@public修饰后就能在类的外部被访问了.类的外部就是指.h和.m文件之外的其他文件就叫做类的外部,类的内部就是.h和.m这对文件中

  d.NSString *_name; // NSString是OC中的字符串类,属于非基本数据类型,使用它定义变量的时候要加*

   NSInteger _age; // NSInteger 是OC 中的整型,是基本数据类型,所以定义实例变量的时候不加*

    NSString *_gender;  //性别

    关于OC中的数据类型,详见博客:http://www.cnblogs.com/Harbingwang/p/4995920.html

   注意:// OC中的类型(也就是非基本数据类型),声明变量的时候,需要加上'*'号

      // C语言基本数据类型不需要加星号*

      // 实例变量的名称全部以'_'开头(注意)

2. Person.m – 类的实现文件

#import "Person.h"

// implementation 实现,这里写是类的实现部分
@implementation Person
// 说话
- (void)sayHello {
    //打印当前对象的姓名,年龄,性别
    NSLog(@"你好!我叫%@,今年%ld岁了,性别是%@", _name, _age, _gender);
}

// 吃饭
- (void)eat {
    NSLog(@"晚上吃麻辣烫");
}
//睡觉
- (void)sleep {
    NSLog(@“到点了,该睡觉了");}
@end 

注意:

  1. 如果我们写了一个方法,没有在.m文件中实现的话,就会在.m文件中报出警告 (Methoh definition for *** not found ),即空实现,原因是只在.h中写了声明,并没有在.m中实现
  2. 一个类的实现也只能写在.m文件中,如果一个类的声明和实现都写在了.m文件,由于没有在.h中声明,所以看不到这个类,这个类就是属于当前.m文件私有的类.
  3. 一对.h和.m文件中不是只能写一个类,可以定义多个类,但是一般都只写一个类, 方便管理
  4. 如果父类继承过来的方法不能满足我们的需要的时候,我们可以重写父类的方法
-(id)init {

    _name = @"黑寡妇";
    _age = ;
    _gender = @"女";return  self;   // self 谁调用这个方法,self就指向谁

}

  5. NSLog 是OC的输出语句,使用NSLog要注意的是,输出的内容一定要写在 @" " 中间,@不能省略; OC打印字符串: 在OC中,字符串不是一个单纯的字符串,而是字符串对象,它属于 NSString (字符串类)创建出的对象.

%@ 是任何类型对象的占位符,只要是打印对象就是用 %@ 占位

  6.@interface和@end是配套使用的。@implementation和@end也是配套使用的。

三 创建对象

  在main中创建对象.在创建之前,我们要将Person这个类的头文件引入main中,引入头文件 #import "Person.h"

  1.使用类创建对象的步骤   1>. 给对象分配内存空间  2>. 进行初始化

  Person *p = [[Person alloc] init];

 1>.[Person alloc] 在堆区开辟内存空间,并返回内存空间的首地址

   上面调用的alloc方法会返回分配好内存的Person对象p,在等号左边用了一个指向Person类型的指针变量p来接收这个对象,注意p左边的*号。所有OC对象都是用指针变量来接收的.记住:利用类名定义一个变量时,类名后面一定要带个*号。

  2>.调用person对象的构造方法init进行初始化

  2. 给对象的实例变量赋值

  p->_name = @"HarbingWang";  //给名字赋值

  p->_age = 23;               //给年龄赋值

  p->_gender = @"男";         //给性别赋值

  使用对象调用方法: [] 大括号是OC中的方法调用符, 方法调用者写在括号左侧,方法名写在括号右侧,中间留点空格。

  [p sayHello];// 调用说话的方法

  OC 采用的是消息收发机制,语句 [p sayHello] 翻译为向对象p发送了一个sayHello的消息,然后p就去检测自己能不能执行这个消息,如果能调用sayHello方法,不能就会报错(Crash)

Objective-C学习篇01—类的声明与实现的更多相关文章

  1. (转载)OC学习篇之---类的延展

    前一篇文章我们介绍了类的类目概念和使用,那么这篇文章我们继续来介绍一下OC中的一个特性:延展. 其实说白了,延展就是弥补C语言中的前向申明,我们知道,在C语言中,如果你想调用一个函数的话,那么在此之前 ...

  2. (转载)OC学习篇之---类目的概念和使用

    上一篇文章介绍了OC中的@class关键字的使用,这一篇我们介绍一下,OC中的一个特有的亮点:类目 首先我们来看一下场景,如果我们现在想对一个类进行功能的扩充,我们该怎么做? 对于面向对象编程的话,首 ...

  3. (转载)OC学习篇之---类的三大特性:封装,继承,多态

    之前的一片文章介绍了OC中类的初始化方法和点语法的使用,今天来继续学习OC中的类的三大特性,我们在学习Java的时候都知道,类有三大特性:继承,封装,多态,这个也是介绍类的时候,必须提到的话题,那么今 ...

  4. (转载)OC学习篇之---类的定义

    之前已经介绍了OC中的一个程序HelloWorld,今天我们继续学习OC中类的相关知识. OC和C的最大区别就是具有了面向对象的功能,那么说到面向对象,就不得不说类这个概念了,如果学过Java的话,那 ...

  5. OC学习篇之---类的延展

    来源:http://blog.csdn.net/jiangwei0910410003/article/details/41775603 前一篇文章我们介绍了类的类目概念和使用:http://blog. ...

  6. OC学习篇之---类的定义

    OC中类的相关知识 OC和C的最大区别就是具有了面向对象的功能,那么说到面向对象,就不得不说类这个概念了,如果学过Java的话,那么对类和对象的概念就不陌生了,因为Java是非常纯正的面向对象设计语言 ...

  7. OC学习篇之---类目的概念和使用

    上一篇文章介绍了OC中的@class关键字的使用http://blog.csdn.net/jiangwei0910410003/article/details/41774747,这一篇我们介绍一下,O ...

  8. OC学习篇之---类的三大特性(封装,继承,多态)

    之前的一片文章介绍了OC中类的初始化方法和点语法的使用:http://blog.csdn.net/jiangwei0910410003/article/details/41683873,今天来继续学习 ...

  9. (转载)OC学习篇之---类的初始化方法和点语法的使用

    昨天介绍了OC中类的定义和使用,今天我们来继续学习类的初始化方法和点语法的使用. 一.首先来看一下类的初始化方法 在Java中我们知道一个每个类都有构造方法,这里的初始化方法就是和构造方法一个概念的, ...

随机推荐

  1. 深入浅出 Java Concurrency (3): 原子操作 part 2

    转:http://www.blogjava.net/xylz/archive/2010/07/02/325079.html 在这一部分开始讨论数组原子操作和一些其他的原子操作. AtomicInteg ...

  2. 利用Java反射机制完成XML到对象的解析

    对于一些小批量的数据,如果采用数据库来存取的话,未免有点大题小作,使用XML文件是个不错的方法,尤其是在一些Web应用中,经常需要缓存一部分数据,如果将这些数据形成XML文件,解析后放入一个Hasht ...

  3. hibernate 3.* C3P0配置 以及为什么需要连接池!

    Hibernate自带的连接池算法相当不成熟. 它只是为了让你快些上手,并不适合用于产品系统或性能测试中. 出于最佳性能和稳定性考虑你应该使用第三方的连接池.只需要用特定连接池的设置替换 hibern ...

  4. Ubuntu 14.04 Remmina远程桌面连接Windows计算机

    可以在/usr/share/applications/目录下启动Remmina远程桌面客户端或者直接在Dash中搜索Remmina即可 启动后如下图,可以新建,复制,编辑,删除远程桌面客户端 选择新建 ...

  5. 【模拟】Codeforces 691C Exponential notation

    题目链接: http://codeforces.com/problemset/problem/691/C 题目大意: 输入一个数,把它表示成a·10b形式(aEb).输出aEb,1<=a< ...

  6. 【最短路】Vijos P1022Victoria的舞会2

    题目链接: https://vijos.org/p/1022 题目大意: 给一张N个点的有向图,求有几块强连通分量.(N<=200) 题目思路: [动态规划] n比较小,可以用floyd暴力把每 ...

  7. 光学字符识别OCR

    1.功能: 光学字符识别(OCR,Optical Character Recognition)是指对文本资料进行扫描,然后对图像文件进行分析处理,获取文字及版面信息的过程 2.典型应用: 名片扫描 3 ...

  8. 数学概念——G 最大公约数

    G - 数论,最大公约数 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit ...

  9. 外星人的供给站 (区间覆盖 t贪心)

    /** 区间覆盖问题 分析: 每个点可以确定两个圆心 圆心的范围形成 一个区间 在这个区间上以任意一点画圆便可将此点 包含在内 如果有两个点所确定的区间相交了 说明这两个点可以用一个圆包含在内 即用一 ...

  10. UVALive 5990 Array Diversit

    题意:对于一个数列A,substring是一个连续子串,subsequence是其非连续子序列.对于一个数字序列,记它的diversity是它的最大元素减去最小元素的差.给出一个数字序列,求与它div ...