IOS开发学习笔记010

面向对象的三大特性

  1、封装

  2、继承

  3、多态

一、封装

将类内部的属性保护起来,在外部不能直接访问,那么如果需要访问怎么办呢?

OC提供了set方法来对成员变量进行访问

set方法

1、作用:提供一个方法给外界设置age属性的值

2、命名规范

  方法名必须是set开头

  set后面跟上成员变量的名称,成员变量首字母必须大写

  返回值一定是void

  一定要接收一个参数,并且和成员变量类型一致

   形参名不能和成员变量名一样

声明

- (void)setAge:(int)newAge;//声明

实现

1 - (void)setAge:(int)newAge//set方法实现
2 {
3     if(newAge <= 0)//如果小于0岁就赋值为1
4     {
5         newAge = 1;
6     }
7     age = newAge;//设置年龄
8 }

使用

1  Student *p = [Student new];//新建对象
2  [p setAge:20];//设置属性
3  [p study];//调用方法

get方法

1、作用:返回对象内部的成员变量

2、命名规范:

肯定有返回值,返回类型和成员变量一致

方法名和成员变量名一样

不需要接收参数

声明

- (int)age;//

实现

1 - (int)age//
2 {
3     return age;
4 }

使用

1  NSLog(@"%d岁的学生在学习!",[p age]);

成员变量的使用

命名规范:

  成员变量都以下划线 _ 开头

  可以跟get方法的名称区分开

  可以跟其他局部变量区分开,一看到下划线开头的变量,肯定是成员变量

 1 @interface Student : NSObject
 2 {
 3     //@public
 4     //成员变量
 5     //让成员变量和get方法区分开,成员变量都要加_
 6     int _no;
 7     int _age;
 8     Sex _sex;
 9 }
10
11 @end

练习1

 1 #import <Foundation/Foundation.h>
 2
 3 //成绩类
 4 /*
 5     C成绩(读写)
 6     OC成绩(读写)
 7     平均分(只读)
 8     总分(只读)
 9  */
10 //类的声明
11 @interface Score : NSObject
12 {
13     int _cScore;//c成绩
14     int _ocScore;//oc成绩
15
16     int _totalScore;//总分
17     int _averageScore;//平均分
18 }
19
20 //方法声明
21 //set
22 - (void)setCScore:(int)newCScore;
23 - (void)setOcScore:(int)newOcScore;
24
25 //get
26 - (int)cScore;
27 - (int)ocScore;
28 - (int)totalScore;
29 - (int)averageScore;
30
31 @end
32
33
34
35 //类的实现
36 @implementation Score
37 //方法实现
38 - (void)setCScore:(int)newCScore
39 {
40     _cScore = newCScore;
41     //计算总分和平均分
42     _totalScore = _cScore + _ocScore;
43     _averageScore = _totalScore/2;
44 }
45 - (void)setOcScore:(int)newOcScore
46 {
47     _ocScore = newOcScore;
48     //计算总分和平均分
49     _totalScore = _cScore + _ocScore;
50     _averageScore = _totalScore/2;
51 }
52
53 - (int)cScore
54 {
55     return _cScore;
56 }
57 - (int)ocScore
58 {
59     return _ocScore;
60 }
61 - (int)totalScore
62 {
63     return _totalScore;
64 }
65 - (int)averageScore
66 {
67     return _averageScore;
68 }
69 @end
70
71
72 int main()
73 {
74     Score *p = [Score new];//新建对象
75     [p setCScore:100];//set方法
76     [p setOcScore:90];//set方法
77
78     NSLog(@"总分:%d",[p totalScore]);
79
80     NSLog(@"平均分:%d",[p averageScore]);
81
82     return 0;
83 }

OC弱语法

如果调用不存在的方法,那么在编译和链接时都不会报错,最多有一个警告。只有在运行时才回出错。

unrecognized selector sent to instance 0x0000034034C0

给对象发送的消息不能识别

OC只有在运行过程中才会检测对象有没有实现相应的方法。

类方法

1、以+开头

2、通过类名调用的方法。

3、类方法不能访问成员变量

4、类方法和对象方法可以重名

5、使用场合:当不需要访问成员变量时尽量用类方法

声明

+ (void)printClassName;//

实现

1 + (void)printClassName//
2 {
3     NSLog(@"class name is Person");
4 }

使用

 [Person printClassName];//类方法的调用,直接使用类名

工具类

没有成员变量的类,里面的方法全是类方法。

示例

 1 #import <Foundation/Foundation.h>
 2 /*
 3 工具类
 4     没有成员变量
 5     所有方法全是类方法
 6  */
 7 //类声明
 8 @interface JiSuanQi : NSObject
 9
10 + (void)printClassName;//类方法
11
12 + (int)sumOfSum1:(int)sum1 andSum2:(int)sum2;//类方法
13
14 @end
15 //类的实现
16 @implementation JiSuanQi
17 + (void)printClassName
18 {
19     NSLog(@"class name is JiSuanQi");
20
21 }
22 + (int)sumOfSum1:(int)sum1 andSum2:(int)sum2
23 {
24     return sum1 + sum2;
25 }
26
27 @end
28
29 int main()
30 {
31
32     [JiSuanQi printClassName];//类方法的调用,直接使用类名
33     int res = [JiSuanQi sumOfSum1:10 andSum2:20];
34     NSLog(@"%d",res);
35     return 0;
36 }

self关键字

谁调用,self代表谁。

如果用对象调用,就代表对象,如果是类调用,就代表类。

成员变量和局部变量同名

  当成员变量和局部变量同名时,采取就近原则,访问的是局部变量

  用self访问成员变量,区分同名的局部变量

self出现的位置:

  所有的OC方法中(对象方法\类方法),不能出现在函数

作用方式:

  使用 "self->成员变量名" 访问当前方法调用的成员变量

  使用 "[self 方法名];" 来调用方法(对象方法\类方法)

1 - (void)setAge:(int)newAge
2 {
3     _age = newAge;
4
5     int _age = 10;//局部变量与成员变量同名时,如果需要使用成员变量,则需要使用self关键字
6     NSLog(@"age is %d",self->_age);//self 是一个指指针,指向调用的对象
7 }

 小练习

  设计Car类,一个对象方法跟其他车子比较车速,返回速度差,一个类方法比较两辆车的车速,返回速度差

 1 #import <Foundation/Foundation.h>
 2
 3 //类的声明
 4 @interface Car : NSObject
 5 {
 6     int _speed;//速度
 7 }
 8 - (void)setSpeed:(int)newSpeed;
 9 - (int)speed;
10 //对象方法
11 /*
12 作用:比较两辆车的速度大小,返回差值
13 方法名:differenceSpeedWithOtherCar:
14 参数:(Car *)otherCar
15 返回值:int
16  */
17 - (int)differenceSpeedWithOtherCar:(Car *)otherCar;
18
19 //类方法
20 /*
21  作用:比较两辆车的速度大小,返回差值
22  方法名:differenceSpeedWithCar1: :
23  参数:(Car *)Car1 (Car *)Car2
24  返回值:int
25  */
26 + (int)differenceSpeedWithCar1:(Car *)Car1 andCar2:(Car *)Car2;
27 @end
28
29 //类的实现
30 @implementation Car
31 //对象方法的实现
32 - (void)setSpeed:(int)newSpeed
33 {
34     _speed = newSpeed;
35 }
36
37 - (int)speed
38 {
39     return _speed;
40 }
41
42 //对象方法
43 - (int)differenceSpeedWithOtherCar:(Car *)otherCar
44 {
45     return [self speed] - [otherCar speed];//self指向调用者也就是本对象
46 }
47
48 //类方法
49
50 + (int)differenceSpeedWithCar1:(Car *)Car1 andCar2:(Car *)Car2;
51 {
52     return [Car1 speed] - [Car2 speed];//通过类调用的话,只能传进来两个参数,因为默认成员变量是0,没有任何实际意义。
53 }
54
55 @end
56
57 int main()
58 {
59     Car *p1 = [Car new];
60     [p1 setSpeed:300];
61
62     Car *p2 = [Car new];
63     [p2 setSpeed:200];
64
65     Car *p3 = [Car new];
66     [p3 setSpeed:90];
67
68     int  res = [p1 differenceSpeedWithOtherCar:p2];//使用对象调用方法
69     NSLog(@"%d",res);
70
71     res = [Car differenceSpeedWithCar1:p1 andCar2:p3];//使用类调用方法
72     NSLog(@"%d",res);
73     return 0;
74 }

二、继承

子类从父类继承一些公共属性和方法。

不允许子类和父类拥有同名的成员变量。

方法可以和父类的方法同名(重写),调用过程是先找子类的,再找父类的。

继承的使用场合

  1、当两个类拥有相同的属性和方法时,可以将相同的东西抽象到一个类中

  2、当类a中含有类B所需的全部或部分属性和方法时,可以让B继承A

继承与组合区别

  继承:A 是 B;

  组合:A 拥有B;

示例

 1 #import <Foundation/Foundation.h>
 2
 3 //Animal类的声明
 4 @interface Animal : NSObject
 5 {
 6     int _age;//年龄
 7     double _weight;//体重
 8 }
 9 //对象方法
10 - (void)setAge:(int)newAge;
11 - (int)age;
12
13 - (void)setWeight:(int)newWeight;
14 - (double)weight;
15
16 - (void)run;
17 @end
18
19
20 //Animal类的实现
21 @implementation Animal
22 //方法实现
23 - (void)setAge:(int)newAge
24 {
25     _age = newAge;
26 }
27 - (int)age
28 {
29     return _age;
30 }
31
32 - (void)setWeight:(int)newWeight
33 {
34     _weight = newWeight;
35 }
36 - (double)weight
37 {
38     return _weight;
39 }
40
41 - (void)run
42 {
43     NSLog(@"动物在奔跑!");
44 }
45
46 @end
47
48
49
50
51
52 //Dog类的声明
53 @interface Dog : Animal
54 {
55     //int _age;//子类不能和父类的成员变量重名
56     int gouPai;//狗牌
57 }
58 //对象方法
59 - (void)run;//重写父类的方法
60 @end
61
62
63 //Dog类的实现
64 @implementation Dog
65 //方法实现
66 - (void)run
67 {
68     NSLog(@"Dog在奔跑!");
69 }
70
71 @end
72
73 //Cat类的声明
74 @interface Cat : Animal
75 {
76
77 }
78 //对象方法
79
80 @end
81
82
83 //Cat类的实现
84 @implementation Cat
85 //方法实现
86
87
88 @end
89
90 int main()
91 {
92     Dog *d = [Dog new];
93     [d setAge:4];
94     [d run];//子类的run会覆盖父类的run方法
95     NSLog(@"%d",[d age]);
96
97     return 0;
98 }

super关键字

如果在子类中想访问父类的方法(对象方法和类方法都可以),可以使用关键字super进行调用 ;  

[super walk];//具体是对象方法还是类方法取决于调用时所处于的环境。

使用场景:子类使用父类的方法时想保留父类的一些操作

1 //方法实现
2 - (void)run
3 {
4     NSLog(@"Dog在奔跑!");
5
6     [super run];//super 关键字,调用父类的方法
7 }

三、多态

  父类指针指向子类对象:多态

1、没有继承就没有多态

2、父指针指向子类对象

3、优点:函数/方法传入父指针,则在调用时可以传入子类指针和父类指针

4、缺点:父类类型的变量,不能直接调用子类特有的方法

代码示例

  1 #import <Foundation/Foundation.h>
  2 /*
  3 多态
  4
  5  */
  6
  7
  8 //Animal类的声明
  9 @interface Animal : NSObject
 10 {
 11    // int _age;//年龄
 12     //double _weight;//体重
 13 }
 14 //对象方法
 15
 16 - (void)eat;
 17 @end
 18
 19
 20 //Animal类的实现
 21 @implementation Animal
 22 //方法实现
 23 - (void)eat
 24 {
 25     NSLog(@"吃吃吃!");
 26 }
 27
 28 @end
 29
 30
 31
 32
 33
 34 //Dog类的声明
 35 @interface Dog : Animal
 36 {
 37     //int _age;//子类不能和父类的成员变量重名
 38     //int gouPai;//狗牌
 39 }
 40 //对象方法
 41 - (void)eat;//重写父类的方法
 42 @end
 43
 44
 45 //Dog类的实现
 46 @implementation Dog
 47 //方法实现
 48 - (void)eat
 49 {
 50     NSLog(@"Dog在吃吃吃!");
 51
 52    // [super eat];//super 关键字,调用父类的方法
 53 }
 54
 55 @end
 56
 57
 58 //Cat类的声明
 59 @interface Cat : Animal
 60 {
 61     //int _age;//子类不能和父类的成员变量重名
 62     //int gouPai;//狗牌
 63 }
 64 //对象方法
 65 - (void)eat;//重写父类的方法
 66 - (void)run;
 67 @end
 68
 69
 70 //Dog类的实现
 71 @implementation Cat
 72 //方法实现
 73 - (void)eat
 74 {
 75     NSLog(@"Cat在吃吃吃!");
 76
 77     // [super eat];//super 关键字,调用父类的方法
 78 }
 79 - (void)run
 80 {
 81       NSLog(@"Cat在跑!");
 82 }
 83 @end
 84
 85
 86 int main()
 87 {
 88     //Dog *d = [Dog new];
 89
 90     //父类指针指向子类对象:多态
 91     Animal *a = [Dog new];
 92     //[a run];//父类指针调用子类的特有方法,会有警告
 93
 94
 95     Dog *d = (Dog *)a;//可以强制转换,调用子类特有的方法
 96     [d eat];
 97
 98
 99
100     return 0;
101 }
时间: 2024-08-14 09:45:37

IOS开发学习笔记010的相关文章

IOS开发学习笔记-(2)键盘控制,键盘类型设置,alert 对话框

一.关闭键盘,放弃第一响应者,处理思路有两种 ① 使用文本框的 Did End on Exit 绑定事件 ② UIControl on Touch 事件 都去操作 sender 的  resignFirstResponder #import <UIKit/UIKit.h> @interface ViewController : UIViewController @property (weak, nonatomic) IBOutlet UITextField *txtUserName; @pro

iOS开发学习笔记:基础篇

iOS开发需要一台Mac电脑.Xcode以及iOS SDK.因为苹果设备都具有自己封闭的环境,所以iOS程序的开发必须在Mac设备上完成(当然,黑苹果应该也是可以的,但就需要花很多的精力去折腾基础环境),Xcode是一个集成开发环境,包括了编辑器.调试.模拟器等等一系列方便开发和部署的工具,iOS SDK则是开发应用所必需,不同的SDK分别对应不同的iOS版本或设备,通常我们需要下载多个iOS SDK以确保我们开发的程序能够在不同版本的iOS上正常运行. 创建新工程 Xcode提供了很多种工程模

IOS开发学习笔记-(3) 进度条、等待动画开始停止

一.创建对应空间视图  ,如下图: 二.编写对应的 .h 代码,如下 : #import <UIKit/UIKit.h> @interface ViewController : UIViewController @property (weak, nonatomic) IBOutlet UIActivityIndicatorView *activWaitNetWork; @property (weak, nonatomic) IBOutlet UIProgressView *pgrsDownLo

IOS开发学习笔记(二)-语音识别(科大讯飞)

上次简单地讲解了如何利用科大讯飞完成语音合成,今天接着也把语音识别整理一下.当然,写代码前我们需要做的一些工作(如申请appid.导库),在上一篇语音合成的文章当中已经说过了,不了解的可以看看我上次的博文,那么这次直接从堆代码开始吧. 详细步骤: 1.导完类库之后,在工程里添加好用的头文件.在视图里只用了一个UITextField显示识别的内容,两个UIButton(一个开始监听语音,一个结束监听),然后引入类.添加代理,和语音合成的一样. MainViewController.h 1 #imp

IOS开发学习笔记(1)-----UILabel 详解

1. [代码][C/C++]代码     //创建uilabelUILabel *label1 = [[UILabel alloc] initWithFrame:CGRectMake(20, 40, 280, 80)];//设置背景色label1.backgroundColor = [UIColor grayColor];//设置taglabel1.tag = 91;//设置标签文本label1.text = @"Hello world!";//设置标签文本字体和字体大小label1.

IOS开发学习笔记(2)-----UIButton 详解

1. [代码][C/C++]代码     //这里创建一个圆角矩形的按钮    UIButton *button1 = [UIButton buttonWithType:UIButtonTypeRoundedRect];    //    能够定义的button类型有以下6种,//    typedef enum {//        UIButtonTypeCustom = 0,          自定义风格//        UIButtonTypeRoundedRect,        

IOS开发学习笔记--语音合成(科大讯飞)

      现在语音服务越来越热,我们平时使用的很多软件都带有语音合成和识别功能,用起来也很方便.说到语音服务,Google和微软都提供过API接口,不过笔者要介绍的是国内的智能语音技术提供商---科大讯飞.之前看过一个比较Google.微软和科大讯飞语音识别引擎的博文(http://fqctyj.blog.163.com/blog/static/70843455201361955322797/),有兴趣可以去看看.笔者接触语音服务的时间也不长,对语音服务也不是很了解,但是拆解过科大讯飞的Dem

IOS开发学习笔记017-什么是IOS开发

应用程序开发流程 1.IOS开发需要思考的问题 用户是谁?不同应用程序的内容和用户体验大不相同,这取决于想要编写的是什么应用程序,它可能是儿童游戏,也可能是待办事项列表应用程序,又或者是测试自己学习成果的应用程序. 应用程序的用途是什么?赋予应用程序一个明确的用途十分重要.了解激发用户使用应用程序的动因是界定用途的一个出发点. 应用程序尝试解决什么问题?应用程序应该完美解决单个问题,而不是尝试解决多个截然不同的问题.如果发现应用程序尝试解决不相关的问题,那么最好考虑编写多个应用程序. 应用程序要

ios开发学习笔记(1)

objective-c基础总结 第一二章 1.application:didiFinishLauchingWithOptions:程序启动后立即执行 2.启动界面代码格式:self.window = [UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];//1.从Infor.plist中取出版本号NString *version = [NSBundle mainBundle].infoDictionary[key];//2.