OC--类与对象
来源:互联网 发布:淘宝教程开店秘籍 编辑:程序博客网 时间:2024/05/19 17:49
OC--类与对象
OC的基本特征
oc文件以.m结尾,一般会加入拷贝文件#import <Foundation/Foundation.h>
Oc编译运行格式:
l cc –c 文件名.m
l cc 文件名.o –framework Foundation
l ./a.out
#import的用途:
1> 跟#include一样,拷贝文件的内容
2> 可以自动防止文件的内容被重复拷贝
输出语句:
NSLog(@”这是一个oc程序!!!”);//带有自动换行功能
类:指的是某一类东西,而不是一个(例如”车“类,车有丰田,现代,奥迪等等)类的注意事项:
1> 类名
*类名的第一个字母必须是大写
*不能有下划线
*多个英文单词,用驼峰标识法
2>属性:名词
3>行为(功能):动词
/*例如Car类
类名:Car
属性:轮胎个数,时速(速度)
行为:跑
*/
1. 类的声明
*成员变量
*方法的声明
@interface 类名 : NSObject
{
@public
成员变量;//(类型 变量名称;)
Int wheels;//轮胎 最好加上备注,提高可读性
成员变量;
……………….
}
方法声明;(动词行为)// -(数据类型)方法名;
- (void)run;
……………
@end
2. 类的实现
@implementation 类名
//用来实现@interface中声明的方法
-(数据类型)方法名
{ 方法内容; }
-(void)run
{
NSLog(@”车子在奔驰着”);
}
@end
int main()
{
类名 *指针名 = [类名 new]; //为类创建对象,对象一创建就会分配内存
指针名 ->变量名称 = 值;//变量名称为属性里的变量名称
[指针名 方法名];//调用方法
return 0;
}
例
<pre name="code" class="cpp">#import <Foundation/Foundation.h>//1.类的声明//用来声明对象的属性,行为//: NSObject 目的是:让Car这个类具备创建对象的能力@interface Car : NSObject{// 用来声明对象属性(成员变量,默认会初始化为0)@public//可以让外部的指针间接访问对象内部的成员变量int wheels;//轮胎个数int speed;//时速(xxkm/h)}//方法(行为):方法名,参数,返回值(声明,实现)//只要是OC对象的方法,必须以 - 开头//OC方法中任何数据类型都必须用小括号()括住//OC方法中的小括号():括住数据类型-(void)run;@end //2.类的实现//用来实现@interface中声明的方法@implementation Car- (void)run{//可直接访问内部类对对应属性的值NSLog(@”有%d个轮子的车子,以时速为%dkm/h跑着”, wheels, speed);}@endint main(){//在OC中,想执行一些行为,就写上一个中括号[行为执行者,行为名称]//利用类来创建对象//执行了Car这个类的new//定义了一个指针变量p,p将来指向的是Car类型的对象//[Car new];每次都会创建一个新的对象,并且会返回新对象本身(新对象的地址)Car * p = [Car new];//调用对象时候会返回地址//给指针所指向对象的属性赋值p->wheels = 4;p->speed = 250;//给p所指向的对象发送一条run消息,并调用执行[p run];NSLog(@”车子的轮子有%d,时速:%dkm/h”, p -> wheels, p ->speed);return 0;}如果要对以创建的对象进行值修改,可以通过指针形式
接上上面我们在创建一个对象:p2
Car *p2 = p;//把指针p的值赋值给p2,此时,p和p2指向同一个对象地址p2 -> wheels = 5;//把对象里的属性值通过指针地址进行修改,修改成功[p run];//此时输出改后的值:车子的轮子有5,时速:250km/h
通过指针对类的属性值进行修改
#import <Foundation/Foundation.h>@interface Car : NSObject{// 成员变量 @public int wheels; int speed;}- (void)run;@end@implementation Car- (void)run{ NSLog(@"%d个轮子,速度为%dkm/h的车子跑起来", wheels, speed);}@endvoid test(int w, int s){ w = 20; s = 200;}void test1(Car *newC){ newC->wheels = 5;}void test2(Car *newC){ Car *c2 = [Car new]; c2->wheels = 5; c2->speed = 300; newC = c2; newC->wheels = 6;}int main(){ Car *c = [Car new]; c->wheels = 4; c->speed = 250; //test(c->wheels, c->speed);//只对函数的值进行修改,并没有把对象的改动 //test1(c);//通过指针传递,对对象的地址进行属性修改 test2(c); //通过指针传递,画图好好分析和test1相似 [c run]; return 0;}
常见错误
l 只有类的声明,没有类的实现
l 漏了@end
l @interface和@implementation嵌套
l 两个类的声明嵌套
l 成员变量没有写在括号里面
l 成员变量例的属性不能直接赋值,必须创建对象后,通过指针对象赋值
l 方法的声明写在了大括号里面
OC方法和函数的区别
方法
1.对象方法都是以减号 -
2.对象方法的声明必须写在@interface和@end之间
对象方法的实现必须写在@implementation和@end之间
3.对象方法只能由对象来调用
4.对象方法归类\对象所有
函数
1.函数能写在文件中的任意位置(@interface和@end之间除外),函数归文件所有
2.函数调用不依赖于对象
3.函数内部不能直接通过成员变量名访问某个对象的成员变量
l OC方法只能声明在@interface和@end之间,只能实现在@implementation和@end之间。也就是说OC方法不能独立于类存在
l C函数不属于类,跟类没有联系,C函数只归定义函数的文件所有
l C函数不能访问OC对象的成员
l 低级错误:方法有声明,但是实现的时候写成了函数
对象嵌套
#import <Foundation/Foundation.h>//性别枚举,并通过typedef重新定义为Sextypedef enum { SexMan, SexWoman} Sex;//结构体定义,并通过typedef重新定义为Datetypedef struct { int year; int month; int day;} Date;//颜色枚举,并通过typedef重新定义为Colortypedef enum { ColorBlack, ColorRed, ColorGreen} Color;//对狗进行类的声明@interface Dog : NSObject{ @public double weight; // 体重 Color curColor; // 毛色}- (void)eat;- (void)run;@end//对狗进行类的实现@implementation Dog- (void)eat{ // 每吃一次,体重就加1 weight += 1; //weight = weight + 1; NSLog(@"狗吃完这次后的体重是%f", weight);}- (void)run{ weight -= 1; NSLog(@"狗跑完这次后的体重是%f", weight);}@end/*学生成员变量:性别、生日、体重、最喜欢的颜色、狗(体重、毛色,吃、跑)方法:吃、跑步、遛狗(让狗跑)、喂狗(让狗吃)*/@interface Student : NSObject{ @public Sex sex; // 性别 Date birthday; // 生日 double weight; // 体重(kg) Color favColor; // 最喜欢的颜色 char *name; // 重点:狗 Dog *dog;//定义狗的类型为指针Dog *,其变量名为dog}- (void)eat;- (void)run;- (void)print;- (void)liuDog;//对狗执行的动作- (void)weiDog;//对狗执行的动作@end@implementation Student//将学生的行为进行实现,并通过方法调用狗的行为- (void)liuDog{ // 让狗跑起来(调用狗的run方法) [dog run];//对狗的行为的调用}- (void)weiDog{ // 让狗吃东西(调用狗的eat方法) [dog eat];}- (void)print{ NSLog(@"性别=%d, 喜欢的颜色=%d, 姓名=%s, 生日=%d-%d-%d", sex, favColor, name, birthday.year, birthday.month, birthday.day);}- (void)eat{ // 每吃一次,体重就加1 weight += 1; //weight = weight + 1; NSLog(@"学生吃完这次后的体重是%f", weight);}- (void)run{ weight -= 1; NSLog(@"学生跑完这次后的体重是%f", weight);}@endint main(){ Student *s = [Student new]; Dog *d = [Dog new]; d->curColor = ColorGreen; d->weight = 20; s->dog = d;//通过指针将狗的对象,传递给学生的dog对象 [s liuDog]; [s weiDog]; return 0;}void test(){ Student *s = [Student new]; s->weight = 50; // 性别 s->sex = SexMan; // 生日 Date d = {2011, 9, 10};//注意结构体的赋值形式 s->birthday = d; s->name = "Jack"; /* s->birthday.year = 2011; s->birthday.month = 9; s->birthday.day = 10; */ // 喜欢的颜色 s->favColor = ColorBlack; /* [s eat]; [s eat]; [s run]; [s run]; */ [s print];}方法的具体定义和实现
1.不带参数的方法
设计一个返回PI的方法
// 方法声明
- (double)pi;
//方法实现
- (double)pi
{
return 3.14;
}
方法调用
2.带一个参数的方法
设计一个计算平方的方法
// 方法声明
- (double)square:(double)number;
//方法实现
- (double)square:(double)number
{
return number * number;
}
方法调用
3.带多个参数的方法
设计一个计算和的方法
// 方法声明
- (double)sumOfNum1:(double)num1andNum2:(double)num2;
//方法实现
- (double)sumOfNum1:(double)num1andNum2:(double)num2
{
return num1 + num2;
}
方法调用
4. 方法名注意
l 冒号也是方法名的一部分
l 同一个类中不允许两个对象方法同名
- OC--类与对象
- OC---类与对象
- OC-类与对象
- OC语言 OC初识-类与对象
- OC runtime 类与对象
- OC面向对象 类与对象
- iOS开发--OC篇--OC类与对象
- OC 第一讲 类与对象
- 黑马程序员--OC-类与对象
- OC基础 - 04 类与对象
- 016-类与对象-OC笔记
- OC基础 - 01类与对象
- iOS-OC中的类与对象
- OC基础DAY02 - 类与对象
- OC语言学习01-类与对象
- OC对象与函数
- OC对象与函数
- 黑马程序员---OC基础---OC简介、OC与C的差异、类和对象与方法
- Cinema4D 平面图形建模
- iptables 入门
- 数据结构之链表
- Android中关于APK文件的下载、安装和卸载
- ORACLE触发器详解
- OC--类与对象
- 第16周 oj题目问题 C: 相同的数字!
- JAVA多线程简单实现方法
- 【POJ2104】K-th Number 主席树?函数式线段树?可持久化线段树?……反正是其中一个
- Arcgis for Js之鼠标经过显示对象名的实现
- 下载Android 5.0源码(附源码)
- linux 查看linux版本
- Android中SQLite应用详解
- 使用GNS3配置路由器后,CPU占用率达90%,该如何解决