黑马程序员——面向对象的封装以及set和get方法
来源:互联网 发布:reveur 知乎 编辑:程序博客网 时间:2024/05/21 16:44
------- Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
一、封装
1、什么是封装
隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别;将抽象得到的数据和行为(功能)相结合,形成一个有机的整体,也就是将数据与操作数据的源代码进行有机的结合,形成“类”,其中数据和函数都是类的成员。简单点说就是隐藏对象的属性和方法的实现细节,对外只公开接口用来调用2、set方法
在开发过程中,考虑到安全性要求,我们一般不在成员变量名前面使用@public、@protected等关键字修饰,而是使用Set方法来为对象提供成员变量的值。在set方法的内部也可以对一些不合理的赋值进行筛选过滤。
Set方法的作用:为外界提供一个设置成员变量值的方法。
命名规范:
(1)方法名必须以set开头
(2)Set后面跟上成员变量的名称,首字母大写
(3)返回值一定是void
(4)一定要接收一个参数,而且参数类型需要和成员变量的类型一致
(5)形参名不能喝成员变量名一样(苹果官方推荐成员变量名前加_以示区分)
Set方法的好处:
(1)不让数据暴露在外,保证了数据的安全性
(2)对设置的数据进行过滤
Set方法使用示例:
Set方法的声明:
#import <Foundation/Foundation.h>@interface Student : NSObject{// @public int _age;}// 提供一个方法给外接设置age属性值- (void) setAge:(int)age;// 学习方法- (void)study;@end
Set方法的实现:
@implementation Student- (void)study{ NSLog(@"一个%d岁的学生正在学习!", age);}- (void)setAge:(int)age{ // 对传进来的参数进行过滤 if (age <= 0){ age = 0; } _age = age;}@end测试程序:
int main(int argc, const char *argv[]){ Student *stu = [Student new];// stu->_age = 10; [stu setAge:10]; [stu study]; return 0;}运行结果:
MyMac:0805 rui$ cc 01-封装.m -framework FoundationMyMac:0805 rui$ ./a.out 2015-04-02 17:15:24.145 a.out[1243:140004] 一个10岁的学生正在学习
3、get方法
Get方法的作用:为调用者返回对象内部的成员变量
命名规范:
(1)一定有返回值,返回值的类型和成员变量的类型一致
(2)方法名和成员变量名一样
(3)不需要接收任何参数
Get方法使用示例:
get方法的声明:
#import <Foundation/Foundation.h>@interface Student : NSObject{// @public int _age;}// 提供一个方法给外接设置age属性值- (void) setAge:(int)age;// 提供一个查询属性_age的方法- (int) age;// 学习方法- (void)study;@endget方法的实现:
implementation Student- (void)study{ NSLog(@"一个%d岁的学生正在学习!", _age);}- (void)setAge:(int)age{ // 对传进来的参数进行过滤 if (age <= 0){ age = 0; } _age = age;}- (int)age{ return _age;}@end测试程序:
nt main(int argc, const char *argv[]){ Student *stu = [Student new];// stu->_age = 10; [stu setAge:10];// [stu study]; NSLog(@"学生的年纪是:%d", [stu age]); return 0;}测试结果:
MyMac:0805 rui$ ./a.out 2015-04-02 17:21:50.409 a.out[1247:142575] 学生的年纪是:10注意1:在实际的开发中,不一定set和get方法都会提供,如果内部的成员变量比如学生的学号这样的数据只允许外界读取,但是不允许修改的情况,则通常只提供get方法而不提供set方法。
注意2:成员变量名的命名以下划线开头,get方法名不需要带下划线,使用下划线开头有两个好处:(1)与get方法的方法名区分开来;(2)可以喝一些其他的局部变量区分开来,下划线开头的变量,通常都是类的成员变量。
4、set和get方法综合使用
/* 设计一个成绩类 * C语言成绩(可读可写) * OC成绩(可读可写) * 总分(只读) * 平均分(只读) */#import <Foundation/Foundation.h>@interface Score : NSObject{ double _cScore; // C语言成绩 double _ocScore; // OC语言成绩 double _totalScore; // 总分 double _avrgScore; // 平均分}- (void)setCScore:(double)cScore;- (double)cScore;- (void)setOCScore:(double)ocScore;- (double)ocScore;- (double)totalScore;- (double)avrgScore;@end@implementation Score- (void)setCScore:(double)cScore{ _cScore = cScore;}- (double)cScore{ return _cScore;}- (void)setOCScore:(double)ocScore{ _ocScore = ocScore;}- (double)ocScore{ return _ocScore;}- (double)totalScore{ _totalScore = _cScore + _ocScore; return _totalScore;}- (double)avrgScore{ _totalScore = _cScore + _ocScore; _avrgScore = _totalScore / 2; return _avrgScore;}@endint main(int argc, const char *argv[]){ Score *s = [Score new]; [s setCScore:90]; [s setOCScore:92]; NSLog(@"总分为:%f,平均分为:%f", [s totalScore], [s avrgScore]); return 0;}
二、类方法
每一个类都会实例一个对象,从而这个对象可以完成某些行为,这些行为就是对象方法,类也有方法,叫做类方法。当我们创建一个对象的时候就已经用到了类方法。例如:Student *s=[Student new] 这句代码中创建了一个Student类型的新对象s,而[Student new]是利用类Student 调用了类方法中的new方法,完成创建对象的方法。new方法存在于父类 NSObject 中定义。
1、基本概念
直接可以用类名来执行的方法(类本身会在内存中占据存储空间,里面有类\对象方法列表)
2、对象方法
·以减号-开头
·只能让对象调用,没有对象,这个方法根本不可能被执行
·对象方法能访问实例变量(成员变量)
·只能让对象调用,没有对象,这个方法根本不可能被执行
·对象方法能访问实例变量(成员变量)
#import <Foundation/Foundation.h>@interface Person : NSObject{ int _age; // 人的年龄属性}// 对象的方法,以 - 开头- (void)setAge:(int)age;- (int)age;// 类的方法,以 + 开头+ (void)printClassName;@end
3、类方法
·以加号+开头·只能用类名调用,对象不能调用
·类方法中不能访问实例变量(成员变量)
·使用场合:当不需要访问成员变量的时候,尽量用类方法
#import <Foundation/Foundation.h>@interface Person : NSObject{ int _age; // 人的年龄属性}// 对象的方法,以 - 开头- (void)setAge:(int)age;- (int)age;- (void)printClassName;// 类的方法,以 + 开头+ (void)printClassName;@end
4、类方法和对象方法可以同名
- (void)printClassName;// 类的方法,以 + 开头+ (void)printClassName;
5、类方法和对象方法的实现
#import <Foundation/Foundation.h>@interface Person : NSObject{ int _age; // 人的年龄属性}// 对象的方法,以 - 开头- (void)setAge:(int)age;- (int)age;- (void)printClassName;// 类的方法,以 + 开头+ (void)printClassName;@end
6、测试运行
int main(int argc, const char *argv[]){ Person *p = [Person new]; [p setAge:23]; NSLog(@"人的年龄是%d", [p age]); [p printClassName]; [Person printClassName]; return 0;}
运行结果:
2015-04-02 19:25:33.339 a.out[1433:176195] 人的年龄是232015-04-02 19:25:33.341 a.out[1433:176195] 对象方法printClassName!2015-04-02 19:25:33.341 a.out[1433:176195] 类方法printClassName!
7、实例
设计一个计算器类 *求和 *求平均值 */#import <Foundation/Foundation.h>@interface Caculator : NSObject// 对象方法,求和- (int)sumOfNum1:(int)num1 andNum2:(int)num2;// 对象方法,求平均值- (int)averageOfNum1:(int)num1 andNum2:(int)num2;// 类方法,求和+ (int)sumOfNum1:(int)num1 andNum2:(int)num2;// 类方法,求平均值+ (int)averageOfNum1:(int)num1 andNum2:(int)num2;@end@implementation Caculator// 对象方法,求和- (int)sumOfNum1:(int)num1 andNum2:(int)num2{ return num1 + num2;}// 对象方法,求平均值- (int)averageOfNum1:(int)num1 andNum2:(int)num2{ return (num1 + num2) / 2;}// 类方法,求和+ (int)sumOfNum1:(int)num1 andNum2:(int)num2{ return num1 + num2;}// 类方法,求平均值+ (int)averageOfNum1:(int)num1 andNum2:(int)num2{ return [Caculator sumOfNum1:num1 andNum2:num2]/ 2;}@endint main(int argc, const char *argv[]){ int num1 = 10; int num2 = 20; Caculator *c = [Caculator new]; int sum1 = [c sumOfNum1:num1 andNum2:num2]; int avrg1 = [c averageOfNum1:num1 andNum2:num2]; int sum2 = [Caculator sumOfNum1:num1 andNum2:num2]; int avrg2 = [Caculator averageOfNum1:num1 andNum2:num2]; NSLog(@"对象方法:%d与%d的和为%d", num1, num2, sum1); NSLog(@"类方法:%d与%d的和为%d", num1, num2, sum2); NSLog(@"对象方法:%d与%d的平均值为%d", num1, num2, avrg1); NSLog(@"类方法:%d与%d的平均值为%d", num1, num2, avrg2); return 0;}
测试运行:
2015-04-02 19:51:25.687 a.out[1505:183651] 对象方法:10与20的和为302015-04-02 19:51:25.688 a.out[1505:183651] 类方法:10与20的和为302015-04-02 19:51:25.688 a.out[1505:183651] 对象方法:10与20的平均值为152015-04-02 19:51:25.689 a.out[1505:183651] 类方法:10与20的平均值为15
0 0
- 黑马程序员——面向对象的封装以及set和get方法
- 黑马程序员-面向对象的三大特性1-封装-set,get方法,弱语法
- 黑马程序员——OC语言------set和get方法(封装)、类方法、self关键字
- oc面向对象—实例变量以及set get方法
- 黑马程序员—Java面向对象(类和对象、封装、构造方法、this关键字、static关键字)
- 黑马程序员_面向对象—>封装
- 黑马程序员——封装之set与get
- 黑马程序员java学习笔记——面向对象的特征封装、继承和多态
- 黑马程序员——面向对象特征一:封装,以及this、static关键字和单例模式
- 黑马程序员——Java基础3 关于面向对象、封装、多态、继承,以及接口和包
- 03.黑马程序员-封装-set方法与get方法
- 黑马程序员--set和get方法
- 黑马程序员——面向对象3:面向对象的特点之——封装(Encapsulation)
- 黑马程序员——面向对象(上)— 类、对象、封装、继承、构造方法
- 黑马程序员——OC基础——set方法和get方法
- 黑马程序员——Objective-C学习之set方法和get方法
- 【黑马程序员】方法、数组、面向对象、封装、继承——Java复习笔记
- 黑马程序员————面向对象之封装
- 对传入where条件的sql语句进行参数化处理
- (6.1.3)存储器管理
- Python 数据分析(一)[MAC]
- 字符过滤拷贝
- IOS 点语法 release 与retain self 的解析
- 黑马程序员——面向对象的封装以及set和get方法
- C++引用作为函数参数
- Linux文件系统简介02
- 字符串匹配KMP算法
- 需要问师兄的问题
- java泛型编程
- JQuery 懒加载
- 常见排序算法
- AppCan亮相区域商业银行信息化高峰年会,移动平台受热捧