Objective-C 笔记二 类、对象和方法
对象就是一个物件。面向对象的程序设计可以看成一个物件和你想对它做的事情。这与C语言不同,C语言通常称为过程性语言。在C语言中,通常是先考虑要做什么,然后才关注对象,这几乎总是与面相对象的思考过程相反。
在面向对象的用语中,(这里我们以汽车作为对象)你的汽车是汽车的一个实例。car就是类的名称,这个实例就是从该类创建的。因此,每制造一辆新汽车,就会创建汽车类的一个新实例,而且汽车的每个实例都称为一个对象。
对象 | 使用对象执行的操作 |
你的汽车 | 驾驶 |
加油 | |
洗车 | |
维修 |
每个实例或对象不仅包含从制造商那里获得的有关原始特性的信息,还包含它的当前特性,这些特性可以动态改变。当你驾驶汽车时,邮箱的油渐渐耗尽,汽车越来越脏,轮胎也逐渐磨损。
对象使用方法可以影响对象的状态。如果方法是“给汽车加油”,那么执行这个方法之后,汽车的邮箱会加满。这个方法影响了汽车邮箱的状态。
这里关键的概念是:对象是类的独特表示,每个对象都包含一些通常对该对象说是私有的信息。方法提供访问和改变这些数据的手段。
[ClassOrInstance method ];
在这条语句中左方括号后要紧跟类的名称或者该类的实例名称,它后面可以是一个或多个空格,空格后面是将要执行的方法。最后,使用右方括号和分号来终止。请求一个类或实例来执行某个操作时,就是在向它发送一条消息,消息的接收者称为接收者。因此,有另一种方式可以表示前面所描述的一般格式:
[ receiver message ];
回顾上一个列表,使用这个新语法为它所编写所有的方法。在此之前,你需要获得一辆新车,去制造厂购买一辆:
yourCar = [Car new]; get a new car //这书写的真详细,不就是new一个对象么!就是yourCar现在就是你的车,你可以用它引用汽车的实例。
有了新车就要有新车的方法,所以这个新方法可叫作制造厂方法,或者类方法:
[yourCar prep]; get it ready for first-time use
[yourCar drive]; drive your car
[yourCar wash]; wash your car
[yourCar getGas]; put gas in your car if you need it
[yourCar service]; service your car
[yourCar topDown]; if it's a convertible
[yourCar topUp];
currentMileage = [yourCar odometer];
最后一个示例显示的实例方法可返回信息,即当前行驶里程,这通过里程表(odometer)可看出来。我们将该信息存储在程序中的currentMileage变量内。
这里有一个将特定值作为方法参数的例子,与方法直接调用有所不同:
[yourCar setSpeed:55]; set the speed to 55 mph
你姐姐Sue可以对她自己的汽车实例使用相同的方法;
[suesCar drive];
[suesCar wash];
[suesCar getGas];
将同一个方法应用于不同的对象是面向对象程序设计背后的主要理念之一。
用于处理分数的Objective-C类
假设要编写一个处理分数的程序,可能需要处理加、减、乘、除等运算。创建了一个Fraction类:
//
// Fraction.h
//
// Created by on 15/11/13.
// Copyright © 2015年 . All rights reserved.
// interface 部分 #import <Foundation/Foundation.h> @interface Fraction : NSObject -(void) print;
-(void) setNumerator :(int) n;
-(void) setDenominator:(int) d;
-(int) numberator;
-(int) denominator; @end
//
// Fraction.m
// HelloWorld
//
// Created by on 15/11/13.
// Copyright © 2015年 . All rights reserved.
// #import "Fraction.h" @implementation Fraction
{
int numberator;
int denominator;
}
-(void) print{
NSLog(@"%i/%i",numberator,denominator);
}
-(void) setNumerator:(int)n{
numberator = n;
}
-(void) setDenominator:(int)d{
denominator = d;
}
-(int) numberator
{
return numberator;
}
-(int) denominator
{
return denominator;
}
@end
//----program 部分----
#import <Foundation/Foundation.h>
int main (int argc,const char * argv[])
{
@autoreleasepool {
Fraction *myFraction; //创建一个分数实例 alloc分配空间 init初始化
myFraction = [[Fraction alloc] init];
//myFraction = [myFraction init]; //Fraction *fact = [[Fraction alloc] init]; //设置分数为1/3
[myFraction setNumerator:];
[myFraction setDenominator:]; // [fact setDenominator:3];
// [fact setNumerator:7]; //使用打印方法显示分数
NSLog(@"The value of myFraction is: %i/%i",[myFraction numberator],[myFraction denominator]);
//[myFraction print];
//
// NSLog(@"Second fraction is:");
// [fact print];
}
return ;
}
@interface部分用于描述类和类的方法;@implementation部分用于描述数据(类对象的实力变量存储的数据),并实现在接口中声明方法的实例代码;program部分的程序代码实现了程序的预期目的。
@interface部分
一般格式类似于:
@interface NewClassName: ParentClassName
propertyAndMethodDeclarations;
@end
按照约定,类名一般以大写字母开头。
- 变量名的名称规则:名称必须以字母或下划线(_)开头,之后可以是任何(大写或者小写)字母、下划线或者0~9之间的数字组合。
- 有些名称不能用作于变量名,例如int。因为其用途对Objective-C编译器而言有特殊含义,这种用法称为保留名或保留字。(就是系统关键字)
- Objective-C中的大小写字母是有区别的,变量名sum、Sum和SUM均表示不同的变量。
类方法和实例方法
-(void) print;
开头的负号(-)通知Objective-C编译器,该方法是一个实例方法。此外,还有一个选择,就是正好(+),它表示类方法。类方法是对类本身执行某些操作的方法,例如,创建类的新实例。
1、返回值
-(int) currentAge;
声明新方法时,必须要告诉OC编译器该方法是否有返回值。括号里就是方法的返回值类型!该方法指定名为currentAge的实例方法将返回一个整型值。
例:double双精度值,void代表无返回类型。
2、方法的参数
-(void) setNumberator: (int) n;
这是一个无返回值类型的实例方法,int用于指明参数类型。就setNumberator来说,其参数名就是n。这个名称可以是任意的。
@implementation部分
@implementation部分包含声明在@interface部分的方法的实例代码,且需要指定存储在类对象中的数据类型。(就是接口类,和实现类)
@implementation部分的一般格式如下:
@implementation NewClassName
{
memberDeclarations;
}
methodDefinitions;
@end
memberDeclarations部分指定了哪种类型的数据将要存储到Fraction中,以及这些数据类型的名称。
program部分
program部分包含解决特定问题的代码,如果有必要,它可以跨越多个文件。其中必须在某个地方有一个名为main的函数,通常情况下,这是程序开始执行的地方。
Fraction *myFraction;
这一行表示myFraction是一个Fraction类型的对象。
myFraction = [[Fraction alloc] init];
alloc是allocate的缩写,因为要为新分数分配内存存储空间。
init方法用于初始化类的实例变量。注意,你正将init消息发送给myFraction。也就是说,要在这里初始化一个特殊的Fraction对象,因此,它没有发送给类,而是发送给了类的一个实例。
init方法也可以返回一个值,即被初始化的对象。将返回值存储到Fraction的变量myFraction中。
让我们重新回到Fraction *myFraction;
myFraction前的星号(*)表明myFraction是Fraction对象的引用(或指针)。变量myFraction实际上并不存储Fraction的数据,而是存储了一个引用(其实是内存地址),表明对象数据在内存中的位置。
好啦!其它的就是些设值方法(setter)和取值方法(getter),就不详细说明啦,应该很好理解的。
Objective-C 笔记二 类、对象和方法的更多相关文章
- Python的高级特性8:你真的了解类,对象,实例,方法吗
Python的高级特性1-7系列是本人从Python2过渡3时写下的一些个人见解(不敢说一定对),接下来的系列主要会以类级为主. 类,对象,实例,方法是几个面向对象的几个基本概念,其实我觉得很多人并不 ...
- Java学习笔记-File类的基本方法
要渐渐养成写博客的习惯-----> 前段时间看Mars的java中的I/O流没怎么懂,发现I/O流好难啊.今天重新看一遍其他教学,还有书籍,做些笔记,记录下每天的学习生活. File类的一些方法 ...
- Java SE学习笔记 --->高级类特性 ---> toString() 方法
概述: toString() 方法在面向对象当中十分常见,使用频率很高,和equals() 方法一样,也是Object类中定义的方法. jdk中 源码: java.lang.Object类中ToStr ...
- day 1类 对象 属性 方法
1. 解决吃啤酒鸭的问题 第一种方式(面向过程): 1)养鸭子 2)鸭子长成 3)杀 4)作料 5)烹饪 6)吃 7)卒 第二种方式(面向对象): 1)找个卖啤酒鸭的人 2)给钱 交易 3)吃 4)胖 ...
- 笔记||Python3之对象的方法
什么是对象的方法? python中的一切类型的数据都是对象. 对象:数据和方法 对象数据:如 a = 'sfd' 对象方法:其实就是属于该对象的函数 对象的方法调用:对象.方法 字符串对象常用的方法: ...
- JAVA笔记2__类/封闭性/构造方法/方法的重载/匿名对象
public class Main { public static void main(String[] args) { Chicken c1 = new Chicken(); Chicken c2 ...
- 初探swift语言的学习笔记四(类对象,函数)
作者:fengsh998 原文地址:http://blog.csdn.net/fengsh998/article/details/29606137 转载请注明出处 假设认为文章对你有所帮助,请通过留言 ...
- java笔记--String类对象解析与运用
--如果朋友您想转载本文章请注明转载地址"http://www.cnblogs.com/XHJT/p/3877236.html "谢谢-- 1.String中的equals和==的 ...
- Python笔记(二十三)_魔法方法_字符串的魔法方法
__str__和__repr__ 如果要把一个类的实例变成字符串,就需要实现魔法方法__str__()和__repr__ >>>class A: def name(self): re ...
随机推荐
- 检查网口流量与前10名流量大IP
此脚本包含的功能有: 1.实时监控任意网卡的流量 2.统计10秒内平均流量 3.统计每个端口在10秒内的平均流量,基于客户端和服务端端口统计.可以看出哪些端口占流量比较大,对于web服务器,一般是80 ...
- struts2令牌,防止重复提交
struts2的令牌,可以用来防止重复提交,其原理是在提交jsp页面中,写入一个隐藏域name="token",然后在action中定义一个变量token并get.set.在服务器 ...
- 【HDOJ】2405 Marbles in Three Baskets
BFS+状态压缩. /* 2405 */ #include <iostream> #include <queue> #include <cstdio> #inclu ...
- Unity 使用BMFont制作字体
参考链接:http://blog.csdn.net/huang9012/article/details/32333913,作者:CSDN huang9012 NGUI版本:3.6.5 要自己制作字体, ...
- Inotify: 高效、实时的Linux文件系统事件监控框架
Inotify: 高效.实时的Linux文件系统事件监控框架 概要 - 为什么需要监控文件系统? 在日常工作中,人们往往需要知道在某些文件(夹)上都有那些变化,比如: 通知配置文件的改变 ...
- POJ3126 Prime Path(BFS)
题目链接. AC代码如下: #include <iostream> #include <cstdio> #include <cstring> #include &l ...
- phpMyAdmin 多个跨站脚本漏洞
漏洞名称: phpMyAdmin 多个跨站脚本漏洞 CNNVD编号: CNNVD-201307-649 发布时间: 2013-08-09 更新时间: 2013-08-09 危害等级: 中危 漏洞类 ...
- ZOJ 3469 Food Delivery
题目大意: 有n个人,住在一条直线上.第i个人的坐标是Xi,街上有个外卖餐馆的位置是X,现在餐厅工作人员要给街上的每个人送饭,送完之后再回到餐厅,送饭人的速度是V,每个人有个不满意值,当这个人送餐时间 ...
- HDU 3829 Cat VS Dog(最大独立集)
题目大意: 有n只猫,有m只狗.现在有P个学生去参观动物园.每个孩子有喜欢的动物和不喜欢的动物.假如他喜欢猫那么他就一定不喜欢狗(反之亦然). 如果一个孩子喜欢一个动物,那么这个动物不会被移除,若是不 ...
- prim模板题
题目链接:http://acm.hrbeu.edu.cn/index.php?act=problem&id=1223 #include <cstdio> #include < ...