04-面向对象语法03

一、 set方法和get方法

1. set方法和get方法的使用场合

@public的成员可以被随意赋值,应该使用set方法和get方法来管理成员的访问(类似机场的安检、水龙头过滤,过滤掉不合理的东西),比如僵尸的生命值不能为负数

2. set方法

1) 作用:用来设置成员变量,可以在方法里面过滤掉一些不合理的值

2) 命名规范:

? 方法都是以set开头,而且后面跟上成员变量名,成员变量名的首字母必须大写

? 形参名称不能跟成员变量同名

? 返回值一定是void

3. get方法

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

2) 命名规范:

a) 肯定有返回值,返回值类型肯定与成员变量类型一致

b) 方法名跟变量名一样

c) 不需要任何参数

4. 成员变量的命名规范

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

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

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

5. 代码示例

#import <Foundation/Foundation.h>

// 声明

@interface Car : NSObject

{

int _wheels; // 轮子个数

}

/*set方法*/

- (void) setWheels:(int)wheels;

/*get方法*/

- (int) wheels;

@end

@implementation Car

// set方法的实现

- (void) setWheels:(int)wheels

{

// 对外面传进来的轮子数进行过滤

if (wheels<=0)

    {

wheels = 1;

    }

_wheels = wheels;

}

// get方法的实现

- (int) wheels

{

return _wheels;

}

@end

6. 封装的好处

? 过滤不合理的值

? 屏蔽内部的赋值过程

? 让外界不必关注内部的细节

7. 练习

/*

 4.设计一个成绩类

 1> 属性

 * C语言成绩 (可读可写)

 * OC成绩 (可读可写)

 * 总分  (只读)

 * 平均分 (只读)

*/

#import <Foundation/Foundation.h>

@interface Score : NSObject

{

int _CScore;//C语言成绩

int _OcScore;//OC成绩

int _TotalScore;//总分

int _AverageScore;//平均分

}

- (void)setCScore:(int)CScore;

- (int)CScore;

- (void)setOcScore:(int)OcScore;

- (int)OcScore;

- (int)TotalScore;

- (int)Average;

@end

@implementation Score

- (void)setCScore:(int)CScore

{

    _CScore = CScore;

//计算成绩

    _TotalScore = _CScore + _OcScore;

    _AverageScore = _TotalScore/2;

}

- (int)CScore

{

return _CScore;

}

- (void)setOcScore:(int)OcScore

{

    _OcScore = OcScore;

//计算成绩

    _TotalScore = _CScore + _OcScore;

    _AverageScore = _TotalScore/2;

}

- (int)OcScore

{

return _OcScore;

}

- (int)TotalScore

{

return _TotalScore;

}

- (int)Average

{

return _AverageScore;

}

@end

int main()

{

    Score *s = [Score new];

    [s setCScore:50];

    [s setOcScore:80];

    NSLog(@"%d----%d",[s TotalScore],[s Average]);

return 0;

}

二、 OC弱语法

//弱语法1

#import <Foundation/Foundation.h>

@interface Person : NSObject

@end

@implementation Person

@end

int main()

{

    Person *p = [Person new];

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

    [p test];

//编译连接 不报错误,运行时报错

//unrecognized selector sent to instance  不能识别消息发送给那个对象

return 0;

}

//弱语法2

#import <Foundation/Foundation.h>

@interface Person : NSObject

@end

@implementation Person

- (void) test

{

    NSLog(@"哈哈哈");

}

@end

int main()

{

    Person *p = [Person new];

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

    [p test];

//编译连接 不报错误,运行时报错

//unrecognized selector sent to instance  不能识别消息发送给那个对象

return 0;

}

//弱语法3

#import <Foundation/Foundation.h>

//@interface Person : NSObject

//

//@end

@implementation Person : NSObject

- (void) test

{

    NSLog(@"哈哈哈");

}

@end

int main()

{

    Person *p = [Person new];

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

    [p test];

//编译连接 不报错误,运行时报错

//unrecognized selector sent to instance  不能识别消息发送给那个对象

return 0;

}

三、 类方法

1. 基本概念

直接可以用类名来执行的方法(类本身会在内存中占据存储空间,里面有类\对象方法列表)

2. 类方法和对象方法对比

1) 对象方法

? 以减号-开头

? 只能让对象调用,没有对象,这个方法根本不可能被执行

? 对象方法能访问实例变量(成员变量)

2) 类方法

? 以加号+开头

? 只能用类名调用,对象不能调用

? 类方法中不能访问实例变量(成员变量)

? 使用场合:当不需要访问成员变量的时候,尽量用类方法

3) 类方法和对象方法可以同名

3. 常见错误代码

#import <Foundation/Foundation.h>

@interface Person : NSObject

//方法以+开头

+ (void)printClassName;

- (void)text;

@end

@implementation Person

+ (void)printClassName

{

    NSLog(@"这个类叫做Person");

}

- (void)text

{

    NSLog(@"调用了text方法");

}

@end

int main()

{

//找不到方法

//[Person text];

// Person *p = [Person new];

/*

     -[Person printClassName]: unrecognized selector sent to instance 0x7fa692f001e0‘

     */

// 系统会认为现在调用的printClassName是一个对象方法

//[p printClassName];

return 0;

}

4. 类方法练习

/*

设计一个计算器类

 * 求和

 * 求平均值

*/

第一种方法

#import <Foundation/Foundation.h>

@interface JiSuanQi : NSObject

- (int)sumOfNum1:(int)num1 andNum2:(int)num2;

- (int)averageOfNum1:(int)num1 andNum2:(int)num2;

@end

@implementation JiSuanQi

- (int)sumOfNum1:(int)num1 andNum2:(int)num2

{

return num1 + num2;

}

- (int)averageOfNum1:(int)num1 andNum2:(int)num2

{

return (mun1 + num2) / 2;

}

@end

int mian()

{

    JiSuanQi *jsq = [JiSuanQi new];

    [jsq sumOfNum1:10 andNum2:13]

return 0;

}

每一次使用计算器类都要创建一个计算器对象

第二种方法 (代码优化)

/*

设计一个计算器类

 * 求和

 * 求平均值

 */

#import <Foundation/Foundation.h>

//工具类:基本没有任何成员变量,里面的方法基本都是类方法

@interface JiSuanQi : NSObject

+ (int)sumOfNum1:(int)num1 andNum2:(int)num2;

+ (int)averageOfNum1:(int)num1 andNum2:(int)num2;

@end

@implementation JiSuanQi

+ (int)sumOfNum1:(int)num1 andNum2:(int)num2

{

return num1 + num2;

}

+ (int)averageOfNum1:(int)num1 andNum2:(int)num2

{

return (mun1 + num2) / 2;

}

@end

int mian()

{

//JiSuanQi *jsq = [JiSuanQi new];

    [JiSuanQi sumOfNum1:10 andNum2:13]

return 0;

}

第三种方法 (代码优化)

/*

设计一个计算器类

 * 求和

 * 求平均值

 */

#import <Foundation/Foundation.h>

//工具类:基本没有任何成员变量,里面的方法基本都是类方法

@interface JiSuanQi : NSObject

+ (int)sumOfNum1:(int)num1 andNum2:(int)num2;

+ (int)averageOfNum1:(int)num1 andNum2:(int)num2;

@end

@implementation JiSuanQi

+ (int)sumOfNum1:(int)num1 andNum2:(int)num2

{

return num1 + num2;

}

+ (int)averageOfNum1:(int)num1 andNum2:(int)num2

{

return [JiSuanQi sumOfNum1:num1 andNum2:num2] / 2;

}

@end

int mian()

{

//JiSuanQi *jsq = [JiSuanQi new];

    [JiSuanQi sumOfNum1:10 andNum2:13]

return 0;

}

四、 self关键字

1. 成员变量和局部变量同名

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

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

2. 使用细节

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

2) 作用

? 概念:指向了当前对象(方法调用者)

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

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

3. 常见错误

? 低级错误:用self去调用函数

? 类方法中用self调用对象方法,对象方法中用self调用类方法

? self死循环

4. 示例

a) 示例1

#import <Foundation/Foundation.h>

@interface Person :NSObject

{

int _age;

}

- (void)setAge:(int)age;

- (int)age;

- (void)test;

@end

@implementation Person

- (void)setAge:(int)age

{

    _age = age;

}

- (int)age

{

return _age;

}

- (void)test

{

//self : 指向了方法调用者,代表着当前对象

int _age = 20;

    NSLog(@"Person的年龄的%d岁",self->_age);

}

@end

int main()

{

    Person *p = [Person new];

    [p setAge:10];

    [p test];

return 0;

}

a) 示例2

#import <Foundation/Foundation.h>

@interface Dog :NSObject

- (void)bark;

- (void)run;

@end

@implementation Dog

- (void)bark

{

    NSLog(@"汪汪汪");

}

- (void)run

{

    [self bark];

    NSLog(@"跑跑跑");

}

@end

int main()

{

    Dog *d = [Dog new];

    [d run];

return 0;

}

a) 示例3

/*

设计一个计算器类

 * 求和

 * 求平均值

 */

#import <Foundation/Foundation.h>

//工具类:基本没有任何成员变量,里面的方法基本都是类方法

@interface JiSuanQi : NSObject

+ (int)sumOfNum1:(int)num1 andNum2:(int)num2;

+ (int)averageOfNum1:(int)num1 andNum2:(int)num2;

@end

@implementation JiSuanQi

+ (int)sumOfNum1:(int)num1 andNum2:(int)num2

{

return num1 + num2;

}

+ (int)averageOfNum1:(int)num1 andNum2:(int)num2

{

//在这种情况下 self代表类

return [self sumOfNum1:num1 andNum2:num2] / 2;

}

@end

int mian()

{

//JiSuanQi *jsq = [JiSuanQi new];

    [JiSuanQi sumOfNum1:10 andNum2:13]

return 0;

}

5. self使用注意点

注意点一

#import <Foundation/Foundation.h>

@interface Person : NSObject

- (void)test;

@end

@implementation Person

- (void)test

{

    NSLog(@"调用了test方法");

    [self test]; //会应发死循环

}

@end

int main ()

{

    Person *p = [Person new];

[p text];

return 0;

}

#import <Foundation/Foundation.h>

@interface Person : NSObject

- (void)test;

+ (void)test;

@end

@implementation Person

- (void)test

{

    NSLog(@"调用了test - 方法");

//[self test]; //会应发死循环

}

+ (void)test

{

    NSLog(@"调用了test + 方法");

    [self test];//会应发死循环

}

@end

int main ()

{

    [Person test];

//    Person *p = [Person new];

//    [p text];

return 0;

}

注意点二

#import <Foundation/Foundation.h>

@interface Person : NSObject

- (void)test;

+ (void)test;

- (void)test1;

+ (void)test2;

@end

@implementation Person

- (void)test

{

    NSLog(@"调用了test - 方法");

//[self test]; //会应发死循环

}

+ (void)test

{

    NSLog(@"调用了test + 方法");

//[self test];//会应发死循环

}

- (void)test1

{

    [self test];//-text 

}

+ (void)test2

{

    [self test];// + text

}

@end

int main ()

{

//[Person test];

    Person *p = [Person new];

    [p text1];

return 0;

}

输出结果

2015-05-19 15:22:46.304 a.out[1225:2200685] 调用了test - 方法

#import <Foundation/Foundation.h>

@interface Person : NSObject

- (void)test;

+ (void)test;

- (void)test1;

+ (void)test2;

@end

@implementation Person

- (void)test

{

    NSLog(@"调用了test - 方法");

//[self test]; //会应发死循环

}

+ (void)test

{

    NSLog(@"调用了test + 方法");

//[self test];//会应发死循环

}

- (void)test1

{

    [self test];

}

+ (void)test2

{

    [self test];

}

@end

int main()

{

    [Person test2];

//Person *p = [Person new];

//[p test1];

return 0;

}

输出结果

2015-05-19 15:24:49.124 a.out[1229:2215202] 调用了test + 方法

时间: 2024-08-13 07:39:09

04-面向对象语法03的相关文章

面向对象语法-03

set方法和get方法 set方法和get方法的使用场合 @public的成员可以被随意赋值,应该使用set方法和get方法来管理成员的访问(类似机场的安检.水龙头过滤,过滤掉不合理的东西),比如僵尸的生命值不能为负数 set方法 作用:用来设置成员变量,可以在方法里面过滤掉一些不合理的值 命名规范: 方法都是以set开头,而且后面跟上成员变量名,成员变量名的首字母必须大写 形参名称不要跟成员变量同名 get方法 作用:返回对象内部的成员变量 命名规范:get方法的名称一般就跟成员变量同名 成员

面向对象语法

//类的声明#import <Foundation/Foundation.h>@interface Car : NSObject  //NSObject让Car类具备有创建对象的能力{   @public   int wheels;   int speed; }- (void)run;@end //类的实现@implementation Car- (void) run{   NSLog(@"@%i个轮子,%i世俗的车子跑起来了",wheels,speed);}@end //

【黑马程序员】————面向对象语法2

一.      set方法和get方法 1.          set方法和get方法的使用场合 @public的成员可以被随意赋值,应该使用set方法和get方法来管理成员的访问(类似机场的安检.水龙头过滤,过滤掉不合理的东西),比如僵尸的生命值不能为负数 成员变量尽量不要用@public 2.          set方法 1)       作用:提供一个方法给外界设置成员变量值,可以在方法里面对参数进行相应过滤 2)       命名规范: 1> 方法名必须以set开头 2> set后面

Bentley.STAAD.RCDC.V8i.04.01.01.03 1CD

1.Bentley Multiframe Advanced V8i SS3 17.00.02.10 Win32_64 1CDBentley Multiframe Advanced V8i SS3 17.00.02.10 Win32_64 1CD Multiframe的分析和设计工具给你一个非常强大和灵活的创建.分析和研究结果的结构的手段.Multiframe唯一的一款功能之间使用VBA自动化的结构分析程序.使用自动化,你可... 2.Bentley Utilities Designer V8i

【黑马程序员】————面向对象语法1

一.  面向对象和面向过程思想 OC是面向对象的,C是面向过程的.面向对象和面向过程只是解决问题的两种不同思想 常用术语 面向过程 Procedure Oriented 面向对象 Object Oriented,简称OO 面向对象编程 Object Oriented Programming,简称OOP 二.  类和对象的关系 面向对象中有2个非常重要的概念:类和对象 OC中的面相对象 1)      OC中的类相当于图纸,用来描述一类事物.也就是说,要想创建对象,必须先有类 2)      OC

SAP-MM:收货转储时提示 M7053“只能在公司代码 **** 的期间 2014/04 和 2014/03 中记账”

错误信息 消息号M7053 解决方法 Step 1.使用MMPV进入"关闭账期"界面. Step 2.输入"公司代码"."期间"."会计年度"后,执行(F8). Step 3.使用MMRV进入"查看打开的账期"界面,当前期间仍为"2014/04". Step 4.同 Step 1.Step 2 操作,将期间改为 "05". Step 5.同 Step 3 操作,当前期

面向对象语法-02

接下来就在OC中模拟现实生活中的情况,创建一辆车出来.首先要有一个车子类,然后再利用车子类创建车子对象 定义OC的类和创建OC的对象 要描述OC中的类稍微麻烦一点,分2大步骤:类的声明.类的实现(定义).跟函数类似,函数有分声明和定义 类的声明 代码编写 定义一个Car类,拥有2个属性:轮子数.时速,1个行为:跑 类名\属性的命名规则:标示符的规则 类名的命名规范:有意义.驼峰标识.首字母大写 #import <Foundation/Foundation.h> // 类的声明 @interfa

OC中的面向对象语法

一. 面向对象和面向过程思想 OC是面向对象的,C是面向过程的.面向对象和面向过程只是解决问题的两种不同思想 1. 面向对象和面向过程的区别 1) 以用电脑听歌为例子 a) 面向过程 打开电脑 播放电脑中的歌曲 关闭电脑 b) 面向对象(不是相亲的“对象”) 电脑 ² 开机 ² 播放歌曲 ² 关机 2) 区别分析 面向过程关注的是解决问题需要哪些步骤:面向对象关注的是解决问题需要哪些对象 没有开发经验很难感受到它们的区别,两种思想都能达到解决问题的目的,但是解决思路不一样 想打电话\发短信 à 

15-01-01 C# 语法 03

类型如果相兼容的两个变量,可以使用自动类型转换或者强制类型转换 但是,如果两个类型的变量不兼容,比如int与string或者int与double 这个时候我们可以使用一个叫做Convert的转换工厂进行转换. string s = "123"; double d = Convert.ToDouble(s);  int i = Convert.ToInt32(s); 注意:使用Convert进行类型转换,也需要满足一个条件:面儿上必须要过得去 double d = Convert.ToD

面向对象语法-01

面向对象和面向过程思想 OC是面向对象的,C是面向过程的.面向对象和面向过程只是解决问题的两种不同思想 面向对象和面向过程的区别 以用电脑听歌为例子 面向过程 打开电脑 播放电脑中的歌曲 关闭电脑 面向对象(不是相亲的“对象”) 电脑 开机 播放歌曲 关机 区别分析 面向过程关注的是解决问题需要哪些步骤:面向对象关注的是解决问题需要哪些对象 没有开发经验很难感受到它们的区别,两种思想都能达到解决问题的目的,但是解决思路不一样 现实生活中面向对象的例子 想打电话\发短信 ? 找手机,不用分析电话要