当前位置:   article > 正文

【黑马程序员】iOS学习之路——Objective-C之面向对象_"nslog(@\"速度为%i的狗跑起来了\", speed)"

"nslog(@\"速度为%i的狗跑起来了\", speed)"

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------


一、面向对象和面向过程

  1. OC是面向对象的,C是面向过程的。面向对象和面向过程只是解决问题的两种不同思想
  2. 1.面向对象和面向过程的区别
  3. 1)以用电脑听歌为例子
  4. a)面向过程
  5. 打开电脑
  6. 播放电脑中的歌曲
  7. 关闭电脑
  8. b)面向对象(不是相亲的“对象”)
  9. 电脑(对象)
  10. 开机
  11. 播放歌曲
  12. 关机
  13. 2)区别分析
  14. 面向过程关注的是解决问题需要哪些步骤;面向对象关注的是解决问题需要哪些对象
  15. 没有开发经验很难感受到它们的区别,两种思想都能达到解决问题的目的,但是解决思路不一样
  1. 2.现实生活中面向对象的例子
  2. 想打电话\发短信 → 找手机,不用分析电话要怎样才能拨通
  3. 去饭店吃饭 → 找服务员,不用分析怎么到厨房炒菜
  4. 汽车坏了 → 找汽车维修工,不用分析修车的步骤
  5. 境界:万物皆对象
  1. 3.常用术语
  2. 面向过程 Procedure Oriented
  3. 面向对象 Object Oriented,简称OO
  4. 面向对象编程 Object Oriented Programming,简称OOP
二、类和对象

  1. 面向对象中有2个非常重要的概念:类和对象
  2. 1.如何创建对象
  3. 1)面向对象解决问题的时候必须有对象,那如何创建对象呢?
  4. 2)现实生活的例子:如何创造汽车对象?
  5. a)需要先有汽车的建造图纸,图纸上描述清楚汽车应该具备的属性和功能(行为)
  6. 属性:轮子数、时速
  7. 功能(行为):跑
  8. b)然后再根据图纸上的描述生成汽车
  9. c)每一辆汽车都是对象,都有自己具体的属性值,都是图纸的实例
  10. d)图纸是抽象的,房子是具体的。图纸是对房子对象的高度概括
  11. 2.OC中的面相对象
  12. 1)OC中的类相当于图纸,用来描述一类事物。也就是说,要想创建对象,必须先有类
  13. 2)OC利用类来创建对象,对象是类的具体存在
  14. 3)因此,面向对象解决问题应该是先考虑需要设计哪些类,再利用类创建多少个对象
  15. 3.需要设计哪些类,如何设计类
  16. 1)类的设计,只关心3样东西:
  17. 事物名称(类名):人(Person)
  18. 属性:身高(height)、年龄(age)
  19. 行为(功能):跑(run)、打架(fight)
  20. 2)一般名词都是类
  21. 坦克发射3颗炮弹轰掉了2架飞机
  22. 小明在公车上牵着一条叼着热狗的狗
三、定义OC类和创建OC对象

  1. 接下来就在OC中模拟现实生活中的情况,创建一辆车出来。首先要有一个车子类,然后再利用车子类创建车子对象
  2. 要描述OC中的类稍微麻烦一点,分2大步骤:类的声明、类的实现(定义)。跟函数类似,函数有分声明和定义
  3. 1.类的声明
  4. 1)代码编写
  5. 定义一个Car类,拥有2个属性:轮子数、时速,1个行为:跑
  6. 类名\属性的命名规则:标示符的规则
  7. 类名的命名规范:有意义、驼峰标识、首字母大写
  8. #import <Foundation/Foundation.h>
  9. // 类的声明
  10. @interface Car : NSObject
  11. {
  12. @public
  13. int wheels; // 多少个轮子
  14. int speed; // 时速
  15. }
  16. - (void)run; // 跑的行为
  17. @end
  18. 2)成员变量
  19. @interface的大括号{}中声明的变量:wheels、speed
  20. @interface的大括号和函数的大括号是不一样的
  21. 默认会初始化为0
  22. 3) @public
  23. @public可以让Car对象的wheels和speed属性被外界访问
  24. 4) NSObject
  25. 加上:NSObject的目的是让Car类具备创建对象的能力
  26. 2.类的实现
  27. // 类的实现
  28. @implementation Car
  29. - (void) run
  30. {
  31. NSLog(@"%i个轮子,%i时速的车子跑起来了", wheels, speed);
  32. }
  33. @end
  1. 3.创建对象
  2. 1)代码编写
  3. // 主函数
  4. int main()
  5. {
  6. // 创建车子对象
  7. Car *c = [Car new];
  8. c->wheels = 3;
  9. c->speed = 300;
  10. [c run];
  11. return 0;
  12. }
  13. 2)main函数的代码分析、内存分析(对象在内存中有成员)
  14. [Car new]每次都会创建出新的对象,并且返回对象的地址,那么就应该用一个指针变量保存对象的地址
  15. Car *c = [Car new];
  16. 用一个指针变量c指向内存中的Car对象
  17. 设置车子对象的属性
  18. 跟用指向结构体的指针访问结构体属性一样,用->
  19. c->wheels = 3;
  20. c->speed = 300;
  1. 4.创建多个Car对象
  2. 分别只设置wheels、speed属性
  3. Car *c1 = [Car new];
  4. c1->wheels = 4;
  5. Car *c2 = [Car new];
  6. c2->speed = 250;
  7. [c1 run];
  8. 1个赋值给另一个,然后修改属性
  9. Car *c1 = [Car new];
  10. c1->wheels = 4;
  11. c1->speed = 250;
  12. Car *c2 = c1;
  13. c2->wheels = 3;
  14. [c1 run];
  1. 5.完整的例子
  2. /*
  3. 类名:Car
  4. 属性:轮胎个数、时速(速度)
  5. 行为:跑
  6. */
  7. // 因为使用了NSObject
  8. #import <Foundation/Foundation.h>
  9. // 完整地写一个函数:函数的声明和定义(实现)
  10. // 完整地写一个类:类的声明和实现
  11. // 1.类的声明
  12. // 声明对象的属性、行为
  13. // : NSObject 目的是:让Car这个类具备创建对象的能力
  14. @interface Car : NSObject
  15. {// 用来声明对象属性(实例变量\成员变量,默认会初始化为0)
  16. // @public可以让外部的指针间接访问对象内部的成员变量
  17. @public
  18. int wheels; // 轮胎个数
  19. int speed; // 时速(xxkm/h)
  20. }
  21. // 方法(行为):方法名、参数、返回值(声明、实现)
  22. // 只要是OC对象的方法,必须以减号 - 开头
  23. // OC方法中任何数据类型都必须用小括号()扩住
  24. // OC方法中的小括号():括住数据类型
  25. - (void)run;
  26. @end
  27. // 2.类的实现
  28. // 用来实现@inteface中声明的方法
  29. @implementation Car
  30. // 方法的实现(说清楚方法里面有什么代码)
  31. - (void)run
  32. {
  33. NSLog(@"车子跑起来了");
  34. }
  35. @end
  36. int main()
  37. {
  38. // 在OC中,想执行一些行为,就写上一个中括号[行为执行者 行为名称]
  39. // 利用类来创建对象
  40. // 执行了Car这个类的new行为来创建新对象
  41. // 定义了一个指针变量p,p将来指向的是Car类型的对象
  42. // [Car new]每次都会创建出一个新对象,并且会返回新对象本身(新对象的地址)
  43. Car *p = [Car new];
  44. Car *p2 = [Car new];
  45. p2->wheels = 5;
  46. p2->speed = 300;
  47. [p2 run];
  48. // 给p所指向对象的wheels属性赋值
  49. p->wheels = 4;
  50. p->speed = 250;
  51. // 给p所指向对象发送一条run消息
  52. [p run];
  53. NSLog(@"车子有%d个轮子,时速位:%dkm/h", p->wheels, p2->speed);
  54. return 0;
  55. }
四、类的声明和实现

  1. 常见错误
  2. 只有类的声明,没有类的实现
  3. 漏了@end
  4. @interface和@implementation嵌套
  5. 两个类的声明嵌套
  6. 成员变量没有写在括号里面
  7. 方法的声明写在了大括号里面
  8. 语法细节
  9. 成员变量不能在{}中进行初始化、不能被直接拿出去访问
  10. 方法不能当做函数一样调用
  11. 成员变量\方法不能用static等关键字修饰,别跟C语言混在一起(暂时忽略)
  12. 类的实现可用写在main函数的后面,主要在声明后面就行了
  1. OC方法和函数的区别
  2. OC方法只能声明在@interface和@end之间,只能实现在@implementation和@end之间。也就是说OC方法不能独立于类存在
  3. C函数不属于类,跟类没有联系,C函数只归定义函数的文件所有
  4. C函数不能访问OC对象的成员
  5. 低级错误:方法有声明,但是实现的时候写成了函数
  6. /*
  7. 方法
  8. 1.对象方法都是以减号 -
  9. 2.对象方法的声明必须写在@interface和@end之间
  10. 对象方法的实现必须写在@implementation和@end之间
  11. 3.对象方法只能由对象来调用
  12. 4.对象方法归类\对象所有
  13. 函数
  14. 1.函数能写在文件中的任意位置(@interface和@end之间除外),函数归文件所有
  15. 2.函数调用不依赖于对象
  16. 3.函数内部不能直接通过成员变量名访问某个对象的成员变量
  17. */
  18. #import <Foundation/Foundation.h>
  19. @interface Person : NSObject
  20. @end
  21. @implementation Person
  22. @end
  23. @interface Car : NSObject
  24. {// 成员变量\实例变量
  25. //int wheels = 4; 不允许在这里初始化
  26. //static int wheels; 不能随便将成员变量当做C语言中的变量来使用
  27. @public
  28. int wheels;
  29. }
  30. - (void)run;
  31. - (void)fly;
  32. @end
  33. int main()
  34. {
  35. // wheels = 10;
  36. /*
  37. Car *c = [Car new];
  38. c->wheels = 4;
  39. //run();
  40. [c run];
  41. */
  42. void test2();
  43. test2();
  44. return 0;
  45. }
  46. @implementation Car
  47. - (void) fly
  48. {
  49. }
  50. /*
  51. void test2()
  52. {
  53. NSLog(@"调用了test2函数-%d", wheels);
  54. }*/
  55. void test()
  56. {
  57. NSLog(@"调用了test函数");
  58. }
  59. - (void)run
  60. {
  61. test();
  62. NSLog(@"%d个轮子的车跑起来了", wheels);
  63. }
  64. @end
五、方法的声明

  1. #import <Foundation/Foundation.h>
  2. /*
  3. 计算器类
  4. 方法:
  5. 1> 返回 π
  6. 2> 计算某个整数的平方
  7. 3> 计算两个整数的和
  8. */
  9. @interface JiSuanQi : NSObject
  10. // 方法名:pi
  11. - (double)pi;
  12. // OC方法中,一个参数对应一个冒号
  13. // 方法名:pingFang:(冒号也是方法名的一部分)
  14. - (int)pingFang:(int)num;
  15. //- (int)sum:(int)num1 :(int)num2;
  16. // 方法名:sumWithNum1:andNum2:
  17. - (int)sumWithNum1:(int)num1 andNum2:(int)num2;
  18. //- (int)sumWithNum1:(int)num1 andNum2:(int)num2 andNum3:(int)num3;
  19. @end
  20. @implementation JiSuanQi
  21. - (double)pi
  22. {
  23. return 3.14;
  24. }
  25. - (int)pingFang:(int)num
  26. {
  27. return num * num;
  28. }
  29. //- (int)sum:(int)num1 :(int)num2
  30. - (int)sumWithNum1:(int)num1 andNum2:(int)num2
  31. {
  32. return num1 + num2;
  33. }
  34. @end
  35. int main()
  36. {
  37. JiSuanQi *jsq = [JiSuanQi new];
  38. int a = [jsq sumWithNum1:20 andNum2:5];
  39. //int a = [jsq sum:10 :5];
  40. //int a = [jsq pingFang:10];
  41. //double a = [jsq pi];
  42. NSLog(@"%i", a);
  43. return 0;
  44. }
六、匿名对象

  1. #import <Foundation/Foundation.h>
  2. @interface Car : NSObject
  3. {
  4. @public
  5. int speed;
  6. }
  7. - (void)run;
  8. @end
  9. @implementation Car
  10. - (void)run
  11. {
  12. NSLog(@"速度为%d的车子跑起来了", speed);
  13. }
  14. @end
  15. int main()
  16. {
  17. /*
  18. Car *c;
  19. c = [Car new];
  20. c->speed = 250;
  21. [c run];*/
  22. // 不要写类似匿名对象这样的代码
  23. // 只要求能说出输出结果
  24. [Car new]->speed = 300;
  25. [[Car new] run];
  26. //Car *c = [Car new];
  27. return 0;
  28. }
七、实例练习

  1. /*
  2. 设计一个方法,用来和其他车比较车速,返回车速的差距
  3. */
  4. #import <Foundation/Foundation.h>
  5. @interface Car : NSObject
  6. {
  7. @public
  8. int speed;
  9. }
  10. - (int)compareSpeedWithOther:(Car *)other;
  11. @end
  12. @implementation Car
  13. - (int)compareSpeedWithOther:(Car *)other
  14. {
  15. // speed
  16. // other->speed
  17. // 返回当前这辆车和other这辆车的速度差距
  18. return speed - other->speed;
  19. }
  20. @end
  21. int main()
  22. {
  23. Car *c1 = [Car new];
  24. c1->speed = 300;
  25. Car *c2 = [Car new];
  26. c2->speed = 250;
  27. int a = [c1 compareSpeedWithOther:c2];
  28. NSLog(@"a=%d", a);
  29. return 0;
  30. }









声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号