黑马程序员------[Objective-C]类和对象
来源:互联网 发布:四川广电网络在线缴费 编辑:程序博客网 时间:2024/05/21 22:31
一,面向对象和面向过程思想
OC是面向对象的,C是面向过程的。面向对象和面向过程只是解决问题的两种不同思想
面向对象和面向过程的区别(以用电脑听歌为例子)
a) 面向过程:打开电脑-->播放电脑中的歌曲-->关闭电脑
b)面向对象:找电脑 开机-->播放歌曲-->关机
区别分析
面向过程关注的是解决问题需要哪些步骤;面向对象关注的是解决问题需要哪些对象
现实生活中面向对象的例子
想打电话/发短信:找手机,不用分析电话要怎样才能拨通
去饭店吃饭: 找服务员,不用分析厨房怎样做菜
汽车坏了: 找修车工,不用分析修车的步骤
类和对象的关系
面向对象中有2个非常重要的概念:类和对象
如何创建对象
面向对象解决问题的时候必须有对象,那如何创建对象呢?
先来看看现实生活的例子:如何创造汽车对象?需要先有汽车的建造图纸,图纸上描述清楚汽车应该具备的属性和功能(行为)
属性:轮子数、时速
功能(行为):跑
然后再根据图纸上的描述生成汽车
每一辆汽车都是对象,都有自己具体的属性值,都是图纸的实例
图纸是抽象的,汽车是具体的。图纸是对汽车对象的高度概括
OC中的面相对象
OC中的类相当于图纸,用来描述一类事物。也就是说,要想创建对象,必须先有类
OC利用类来创建对象,对象是类的具体存在
因此,面向对象解决问题应该是先考虑需要设计哪些类,再利用类创建多少个对象
需要设计哪些类,如何设计类
类的设计,只关心3样东西
事物名称(类名):人(Person)
属性:身高(height)、年龄(age)
行为(功能):跑(run)、打架(fight)
一般名词都是类,拥有相同(或者类似)属性和行为的对象都可以抽像出一个类,哪个对象最清楚这个行为,就把这个行为写到哪个对象中去。打开电脑(开机)这个行为应该是属于电脑的。
二, 定义OC的类和创建OC的对象
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; }
不带参数的方法
方法的调用
带一个参数的方法
带两个参数的方法
带两个参数的方法的调用
方法名注意
冒号也是方法名的一部分
同一个类中不允许两个对象方法同名
- 黑马程序员---Objective-C 类和对象
- 黑马程序员------[Objective-C]类和对象
- 黑马程序员——Objective-C中的类和对象
- 黑马程序员_第六天视频学习 Objective-C的基本语法、类和对象
- 黑马程序员—Objective-C学习—基本语法、类和对象
- 黑马程序员—Objective-C学习—类和对象的内存管理
- 黑马程序员————Objective C——类和对象
- 黑马程序员——Objective-C——思想、类和对象
- 黑马程序员——Objective-C中的类与对象
- 黑马程序员Objective-C笔记:对象方法,类方法
- 黑马程序员--- objective-c的类 对象 方法
- 黑马程序员---Objective-C @property和@synthesize
- 黑马程序员——Objective-C学习之定义OC的类和创建OC的对象
- 黑马程序员——Objective-C知识点总结之类和对象
- 黑马程序员Objective-C笔记:类
- 黑马程序员----objective-C 类的设计
- 黑马程序员---Objective-C 类的本质
- 黑马程序员--- objective-c 类的继承
- loadrunner如何监控Windows资源
- html隐藏域的作用
- ThreadLocal 那点事儿
- 旋转数组的最小数字
- iOS客户端学习-MJRefresh
- 黑马程序员------[Objective-C]类和对象
- Android中内容提供者ContentProvider的使用
- 世界杯和二叉堆
- RadioButtonList绑定后台数据,触发点击事件
- beautifulsoup的安装及引入
- ThreadLocal 那点事儿(续集)
- Web.xml配置详解
- 黑马程序员------[Objective-C]set方法和get方法
- 自动化测试