黑马程序员------[Objective-C]类和对象

来源:互联网 发布:四川广电网络在线缴费 编辑:程序博客网 时间:2024/05/21 22:31
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

一,面向对象和面向过程思想


OC是面向对象的,C是面向过程的。面向对象和面向过程只是解决问题的两种不同思想

面向对象和面向过程的区别(以用电脑听歌为例子)

a) 面向过程:打开电脑-->播放电脑中的歌曲-->关闭电脑
b)面向对象:找电脑  开机-->播放歌曲-->关机

区别分析

面向过程关注的是解决问题需要哪些步骤;面向对象关注的是解决问题需要哪些对象

现实生活中面向对象的例子

想打电话/发短信:找手机,不用分析电话要怎样才能拨通
去饭店吃饭:        找服务员,不用分析厨房怎样做菜
汽车坏了:            找修车工,不用分析修车的步骤

类和对象的关系


面向对象中有2个非常重要的概念:类和对象

如何创建对象

面向对象解决问题的时候必须有对象,那如何创建对象呢?

先来看看现实生活的例子:如何创造汽车对象?

需要先有汽车的建造图纸,图纸上描述清楚汽车应该具备的属性和功能(行为)

属性:轮子数、时速

功能(行为):跑

然后再根据图纸上的描述生成汽车

每一辆汽车都是对象,都有自己具体的属性值,都是图纸的实例

图纸是抽象的,汽车是具体的。图纸是对汽车对象的高度概括


OC中的面相对象

OC中的相当于图纸,用来描述一类事物。也就是说,要想创建对象,必须先有类

OC利用类来创建对象,对象是类的具体存在

因此,面向对象解决问题应该是先考虑需要设计哪些类,再利用类创建多少个对象


需要设计哪些类,如何设计类

类的设计,只关心3样东西

事物名称(类名):人(Person)

属性:身高(height)、年龄(age)

行为(功能):跑(run)、打架(fight)

一般名词都是类,拥有相同(或者类似)属性和行为的对象都可以抽像出一个类,哪个对象最清楚这个行为,就把这个行为写到哪个对象中去。打开电脑(开机)这个行为应该是属于电脑的。

二, 定义OC的类和创建OC的对象

接下来就在OC中模拟现实生活中的情况,创建一辆车出来。首先要有一个车子类,然后再利用车子类创建车子对象,要描述OC中的类稍微麻烦一点,分2大步骤:类的声明类的实现(定义)。跟函数类似,函数有分声明和定义


1.    类的声明

1)       代码编写

   定义一个Car类,拥有2个属性:轮子数、时速,1个行为:跑

   类名\属性的命名规则:标示符的规则

   类名的命名规范:有意义、驼峰标识、首字母大写

/**  * 文件名:Car.h  */#include <Foundation/Foundation.h>// 类的声明@interface Car : NSObject // : NSObject让Car具有创建对象的能力{    @public // @public可以让Car对象的属性被外界访问    int wheels // 轮子    int speed //速度}- (void)run // 跑的行为@end


2.    类的实现

/**  * 文件名 Car.m  */@implementation - (void) run{    NSLog(@"%d个轮子,%d时速的车子跑起来了", wheels, speed);}@end

3.    创建对象

/**  * 文件名:mian.m  */#import <Foundation/Foundation.h>#import "Car.h"int main(void){    // 创建车子对象    Car *car = [Car New];        //给对象的属性赋值    car->wheels = 3;    car->speed = 200;       // 掉用对象的方法    [car run];    return 0;}

   main函数的代码分析、内存分析(对象在内存中有成员)

   [Car new]每次都会创建出新的对象,并且返回对象的地址,那么就应该用一个指针变量保存对象的地址

Car *c = [Car new];

用一个指针变量c指向内存中的Car对象       

  设置车子对象的属性

跟用指向结构体的指针访问结构体属性一样,用->

c->wheels = 3;c->speed = 300;


创建多个Car对象 分别只设置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];

常见错误

  只有类的声明,没有类的实现

  漏了@end

 @interface和@implementation嵌套

 两个类的声明嵌套

  成员变量没有写在括号里面

 方法的声明写在了大括号里面

 

语法细节

成员变量不能在{}中进行初始化、不能被直接拿出去访问

方法不能当做函数一样调用

成员变量\方法不能用static等关键字修饰,别跟C语言混在一起(暂时忽略)

类的实现可用写在main函数的后面,主要在声明后面就行了

 

OC方法和函数的区别

  OC方法只能声明在@interface和@end之间,只能实现在@implementation和@end之间。也就是说OC方法不能独立于类存在

C函数不属于类,跟类没有联系,C函数只归定义函数的文件所有

C函数不能访问OC对象的成员

 低级错误:方法有声明,但是实现的时候写成了函数

 

 OC的方法注意

方法只有声明,没有实现(经典错误)

方法没有声明,只有实现(编译器警告,但是能调用,OC的弱语法)

编译的时候:访问没有的成员变量直接报错,访问没有的方法,只是警告


@implementation

没有@interface,只有@implementation,也是能成功定义一个类的 @implementation中不能声明和@interface一样的成员变量

@implementation Car: NSObject{    @public    int wheels; //多少个轮子    int speed; //时速}- (void) run{    NSLog(@"%i个轮子,%i时速的车子跑起来了", wheels,speed);}@end

匿名对象

属性访问

[Car new]->speed = 200;

  方法调用

[ [Car new]  run];


方法

以下是一个计算器类

#import <Foundation/Foundation.h>/*计算器类 方法: 1> 返回 π  2> 计算某个整数的平方 3> 计算两个整数的和*/@interface JiSuanQi : NSObject// 方法名:pi- (double)pi;// OC方法中,一个参数对应一个冒号// 方法名:pingFang:(冒号也是方法名的一部分)- (int)pingFang:(int)num;//- (int)sum:(int)num1 :(int)num2;// 方法名:sumWithNum1:andNum2:- (int)sumWithNum1:(int)num1 andNum2:(int)num2;//- (int)sumWithNum1:(int)num1 andNum2:(int)num2 andNum3:(int)num3;@end@implementation JiSuanQi- (double)pi{    return 3.14;}- (int)pingFang:(int)num{    return num * num;}//- (int)sum:(int)num1 :(int)num2- (int)sumWithNum1:(int)num1 andNum2:(int)num2{    return num1 + num2;}@endint main(){    JiSuanQi *jsq = [JiSuanQi new];    double a = [jsq pi];        int b =  [jsq pingFang:10];    int c = [jsq sum:10 :5];    int d = [jsq sumWithNum1:20 andNum2:5];        NSLog(@"%d", a);    NSLog(@"%d", b);    NSLog(@"%d", c);    NSLog(@"%d", d);    return 0; } 

不带参数的方法


方法的调用




带一个参数的方法



带一个参数的方法的调用

带两个参数的方法


带两个参数的方法的调用



 方法名注意

  冒号也是方法名的一部分

 同一个类中不允许两个对象方法同名


------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
0 0
原创粉丝点击