标签:
? 接下来就在OC中模拟现实生活中的情况,创建一辆车出来。首先要有一个车子类,然后再利用车子类创建车子对象
? 要描述OC中的类稍微麻烦一点,分2大步骤:类的声明、类的实现(定义)。跟函数类似,函数有分声明和定义
1) 代码编写
? 定义一个Car类,拥有2个属性:轮子数、时速,1个行为:跑
? 类名\属性的命名规则:标示符的规则
? 类名的命名规范:有意义、驼峰标识、首字母大写
#import <Foundation/Foundation.h> // 类的声明 @interface Car : NSObject { @public int wheels; // 多少个轮子 int speed; // 时速 } - (void)run; // 跑的行为 @end
1) 成员变量
? @interface的大括号{}中声明的变量:wheels、speed
? @interface的大括号和函数的大括号是不一样的
? 默认会初始化为0
2) @public
@public可以让Car对象的wheels和speed属性被外界访问
3) NSObject
加上:NSObject的目的是让Car类具备创建对象的能力
// 类的实现 @implementation Car //方法实现(说清楚方法里面有什么代码) - (void) run { NSLog(@"%i个轮子,%i时速的车子跑起来了", wheels, speed); } @end
1) 代码编写
// 主函数 int main() { // 创建车子对象 Car *c = [Car new]; c->wheels = 3; c->speed = 300; [c run]; return 0; }
1) main函数的代码分析、内存分析(对象在内存中有成员)
? [Car new]每次都会创建出新的对象,并且返回对象的地址,那么就应该用一个指针变量保存对象的地址
Car *c = [Car new];
用一个指针变量c指向内存中的Car对象
? 设置车子对象的属性
跟用指向结构体的指针访问结构体属性一样,用->
c->wheels = 3; c->speed = 300;
? 分别只设置wheels、speed属性
Car *c1 = [Car new]; c1->wheels = 4; Car *c2 = [Car new]; c2->speed = 250; [c1 run];
? 1个赋值给另一个,然后修改属性
Car *c1 = [Car new]; c1->wheels = 4; c1->speed = 250; Car *c2 = c1; c2->wheels = 3; [c1 run];
? 更加接近人类的思考方式
? 只需要关注对象,不需要关注步骤
? 对象成员变量作为函数参数
? 指向对象的指针作为函数参数
u 修改指向指向对象的成员
u 修改指针的指向
/* 人 类名:Person 属性:体重、年龄 行为: 走路,吃 */ #import <Foundation/Foundation.h> /* 1、类的声明 * 成员变量 * 方法实现 */ @interface Person : NSObject { //成员变量 @public int age; double weight; } //方法声明 - (void)walk; - (void)eat; @end // 类的实现 @implementation Person //实现@interface中声明的方法 - (void)walk { NSLog(@"年龄%d,体重%.2f ,走了一段路",age,weight); } - (void)eat { NSLog(@"年龄%d,体重%.2f ,在吃东西",age,weight); } @end int main() { //在使用类创建对象之前,会将类加载进内存 Person *p = [Person new]; p->age = 20; p->weight = 40; [p eat]; [p walk]; Person *p2 = [Person new]; p2->age = 30; p2->weight = 60; [p2 eat]; [p2 walk]; /* Person *p = [Person new]; p->age = 20; p->weight = 40; [p eat]; [p walk]; 2015-05-18 15:11:23.946 a.out[3193:2655758] 年龄20,体重40.00 ,在吃东西 2015-05-18 15:11:23.947 a.out[3193:2655758] 年龄20,体重40.00 ,走了一段路 */ /* Person *p = [Person new]; p->age = 20; p->weight = 40; Person *p2 = [Person new]; p2->age = 30; p2->weight = 50; p = p2; p->age = 40; [p2 walk]; 2015-05-18 15:07:40.972 a.out[3178:2643045] 年龄40,体重50.00 ,走了一段路 */ /* Person *p = [Person new]; p->age = 20; p->weight = 40; Person *p2 = p; p2->age = 30; [p walk]; 2015-05-18 15:05:09.726 a.out[3167:2635909] 年龄30,体重40.00 ,走了一段路 */ /* Person *p = [Person new]; p->age = 20; p->weight = 50.0; [p walk]; Person *p2 = [Person new]; p2->age = 30; p2->weight = 60.0; [p2 walk]; 输出结果 2015-05-18 14:51:09.105 a.out[3118:2605106] 年龄20,体重50.00 ,走了一段路 2015-05-18 14:51:09.106 a.out[3118:2605106] 年龄30,体重60.00 ,走了一段路 */ return 0; }
u @interface就好像暴露在外面的时钟表面
u @implementation就好像隐藏在时钟内部的构造实现
l 只有类的声明,没有类的实现
l 漏了@end
l @interface和@implementation嵌套
l 两个类的声明嵌套
l 成员变量没有写在括号里面
l 方法的声明写在了大括号里面
l 成员变量不能在{}中进行初始化、不能被直接拿出去访问
l 方法不能当做函数一样调用
l 成员变量\方法不能用static等关键字修饰,别跟C语言混在一起(暂时忽略)
l 类的实现可用写在main函数的后面,主要在声明后面就行了
#import <Foundation/Foundation.h> @interface Car : NSObject { @public int wheels; } - (void)run; @end int main() { Car *c = [Car new]; c->wheels = 4; [c run]; return 0; } @implementation Car void text() { NSLog(@"调用了text方法"); } - (void)run { text(); NSLog(@"%d个轮子跑起来了",wheels); } @end //错误9 /* int main() { return 0; } @interface Car : NSObject { int wheels; } - (void)run; @end @implementation Car - (void)run { NSLog(@"%d个轮子跑起来了",wheels); } */ //错误8 /* @interface Car : NSObject { // static int wheels; 不能随便将成员变量当做C语言中的变量来使用 } - (void)run; @end @implementation Car - (void)run { NSLog(@"%d个轮子跑起来了",wheels); } @end int main() { return 0; } */ //错误7 /* #import <Foundation/Foundation.h> @interface Car : NSObject { int wheels; } - (void)run; @interface Person : NSObject @end @end @implementation Car - (void)run { NSLog(@"%d个轮子跑起来了",wheels); } @end int main() { return 0; } */ //错误6 /* #import <Foundation/Foundation.h> @interface Car : NSObject { int wheels; } - (void)run; @interface Person : NSObject @end @end @implementation Car - (void)run { NSLog(@"%d个轮子跑起来了",wheels); } @end int main() { return 0; } */ //错误五 /* #import <Foundation/Foundation.h> @interface Car : NSObject { int wheels; } - (void)run; @end @implementation - (void)run { NSLog(@"%d个轮子跑起来了",wheels); } @end int main() { return 0; } */ //错误四 /* #import <Foundation/Foundation.h> @interface Car : NSObject { int wheels; - (void)fly; } - (void)run; @end @implementation Car - (void)run { NSLog(@"%d个轮子跑起来了",wheels); } @end int main() { return 0; } */ //错误三 /* #import <Foundation/Foundation.h> @interface Car : NSObject { int wheels; } - (void)run; @end @implementation Car - (void)fly; - (void)run { NSLog(@"%d个轮子跑起来了",wheels); } @end int main() { return 0; } */ //错误二 /* @interface Car : NSObject { int wheels; } - (void)run; - (void)fly { } @end @implementation Car - (void)run { NSLog(@"%d个轮子跑起来了",wheels); } @end int main() { return 0; } */ //错误一 /* #import <Foundation/Foundation.h> @interface Car : NSObject { int wheels; } @implementation Car - (void)run { NSLog(@"%d个轮子跑起来了",wheels); } @end @end int main() { return 0; } */
1.对象方法都是以减号 -开头
2.对象方法的声明必须在@interface会@end之间
对象方法的实现必须写在@implementation和@end之间
3.对象方法只能对象来调用
函数
1、函数能写在文件中的任意位置(@interface和@end之间 不可以的 ),函数归文件所有
2、函数调用不依赖对象
3、函数内部不能直接通过成员变量名访问某个对象的成员变量
l 方法只有声明,没有实现(经典错误)
l 方法没有声明,只有实现(编译器警告,但是能调用,OC的弱语法)
l 编译的时候:访问没有的成员变量直接报错,访问没有的方法,只是警告
? 没有@interface,只有@implementation,也是能成功定义一个类的
@implementation Car : NSObject { @public int wheels; // 多少个轮子 int speed; // 时速 } - (void) run { NSLog(@"%i个轮子,%i时速的车子跑起来了", wheels, speed); } @end
? @implementation中不能声明和@interface一样的成员变量
/* 学生 成员变量:性别、生日、调整、喜欢的颜色、狗(体重、毛色、吃、跑) 方法:吃、跑步、遛狗(让狗跑)、喂狗(让狗吃) */ #import <Foundation/Foundation.h> typedef enum{ SexMan, SexWoman }Sex; typedef struct { int year; int month; int day; }Date; typedef enum{ ColorBlack, ColorRed, ColorGreen }Color; @interface Dog : NSObject { @public double weight; //体重 Color curColor; //毛色 } - (void)eat; //吃 - (void)run; //跑步 @end @implementation Dog //吃 - (void)eat { weight += 1; NSLog(@"狗吃完这次后的体重是%.2f",weight); } //跑步 - (void)run { weight -= 1; NSLog(@"狗跑完这次后的体重是%.2f",weight); } @end @interface Student : NSObject { @public Sex sex; //性别 Date birthday; //生日 double weight; //体重 Color favColor; //最喜欢的颜色 char *name; //姓名 Dog *dog; //狗的属性 } - (void)eat; //吃 - (void)run; //跑步 - (void)print; //打印所有数据 - (void)liuDog; //遛狗 - (void)weiDog; //喂狗 @end @implementation Student //吃 - (void)eat { weight += 1; NSLog(@"学生吃完这次后的体重是%.2f",weight); } //跑步 - (void)run { weight -= 1; NSLog(@"学生跑完这次后的体重是%.2f",weight); } //打印所有数据 - (void)print { NSLog(@"性别 = %d,喜欢的颜色 = %d,姓名 = %s, 生日 = %d-%d-%d",sex,favColor,name,birthday.year,birthday.month,birthday.day); } //遛狗 - (void)liuDog { [dog run]; } //喂狗 - (void)weiDog { [dog eat]; } @end int main() { Student *s = [Student new]; s->weight = 50; //性别 s->sex = SexMan; //生日 s->birthday.year = 1995; s->birthday.month = 10; s->birthday.day = 20; //喜欢的颜色 s->favColor = ColorBlack; //姓名 s->name = "Sunda"; [s print]; Dog *d = [Dog new]; //狗的颜色 d->curColor = ColorGreen; //狗的体重 d->weight = 20; s->dog = d; [s liuDog]; [s weiDog]; return 0; } void text() { Student *s = [Student new]; }
设计一个Caculator计算器类,它拥有计算的功能(行为)
u 设计一个返回PI的方法
// 方法声明
- (double)pi;
// 方法实现
- (double)pi
{
return 3.14;
}
u 方法调用
u 设计一个计算平方的方法
// 方法声明
- (double)square:(double)number;
// 方法实现
- (double)square:(double)number
{
return number * number;
}
u 方法调用
u 设计一个计算和的方法
// 方法声明
- (double)sumOfNum1:(double)num1 andNum2:(double)num2;
// 方法实现
- (double)sumOfNum1:(double)num1 andNum2:(double)num2
{
return num1 + num2;
}
u 方法调用
l 冒号也是方法名的一部分
l 同一个类中不允许两个对象方法同名
给Car类设计一个方法,用来和其他车比较速度,返回车速的差距
#import <Foundation/Foundation.h> @interface Car : NSObject { @public int speed; } - (int)compareSpeedWithOther:(Car *)other; @end @implementation Car - (int)compareSpeedWithOther:(Car *)other { //返回 return speed - other->speed; } @end int main() { Car *c1 = [Car new]; c1->speed = 300; Car *c2 = [Car new]; c2->speed = 400; int a = [c1 compareSpeedWithOther:c2]; NSLog(@"%d",a); return 0; }
l 属性访问
[Car new]->speed = 200;
l 方法调用
[ [Car new] run];
#import <Foundation/Foundation.h> @interface Car : NSObject { @public int speed; } - (void)run; @end @implementation Car - (void)run { NSLog(@"速度为%d的车子跑起来了",speed); } @end int main() { /*用名字的对象*/ Car *c; c = [Car new]; c->speed = 250; [c run]; /*匿名对象*/ [Car new]->speed = 300; [[Car new] run]; return 0; } 2015-05-18 21:09:45.887 a.out[4025:3276924] 速度为0的车子跑起来了
标签:
原文地址:http://www.cnblogs.com/sundaboke/p/4513103.html