黑马程序员---oc--面向对象
2015-03-13 20:12
211 查看
**第一讲 面向对象的基本思想**
一、 面向对象和面向过程思想
面向对象和面向过程只是解决问题的两种不同思想
1.区别分析
面向过程关注的是解决问题需要哪些步骤;面向对象关注的是解决问题需要哪些对象
没有开发经验很难感受到它们的区别,两种思想都能达到解决问题的目的,但是解决思路不一样
二、 类和对象的关系
面向对象中有2个非常重要的概念:类和对象
1. OC中的面相对象
1) OC中的类相当于图纸,用来描述一类事物。也就是说,要想创建对象,必须先有类
2) OC利用类来创建对象,对象是类的具体存在
3) 因此,面向对象解决问题应该是先考虑需要设计哪些类,再利用类创建多少个对象
需要设计哪些类,如何设计类
1) 类的设计,只关心3样东西:
事物名称(类名):人(Person)
属性:身高(height)、年龄(age)
行为(功能):跑(run)、打架(fight)
2) 一般名词都是类
3) 拥有相同(或者类似)属性和行为的对象都可以抽像出一个类
**第二讲 类和对象**
一、 定义OC的类和创建OC的对象
类的声明
1) 代码编写
定义一个Car类,拥有2个属性:轮子数、时速,1个行为:跑
类名\属性的命名规则:标示符的规则
类名的命名规范:有意义、驼峰标识、首字母大写
// 类的声明
@interface Car : NSObject
{
@public
int wheels; // 多少个轮子
int speed; // 时速
}
(void)run; // 跑的行为
@end
2) 成员变量
@interface的大括号{}中声明的变量:wheels、speed
@interface的大括号和函数的大括号是不一样的
默认会初始化为0
3) @public
@public可以让Car对象的wheels和speed属性被外界访问
4) NSObject
加上:NSObject的目的是让Car类具备创建对象的能力
类的实现
// 类的实现
@implementation Car
(void) run
{
NSLog(@”%i个轮子,%i时速的车子跑起来了”, wheels, speed);
}
@end
创建对象
1) 代码编写
// 主函数
int main()
{
// 创建车子对象
Car *c = [Car new];
c->wheels = 3;
c->speed = 300;
[c run];
return 0;
}
2) 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];
一个赋值给另一个,然后修改属性
Car *c1 = [Car new];
c1->wheels = 4;
c1->speed = 250;
Car *c2 = c1;
c2->wheels = 3;
[c1 run];
/* 类名:Car 属性:轮胎个数、时速(速度) 行为:跑 */ // 因为使用了NSObject #import <Foundation/Foundation.h> // 完整地写一个函数:函数的声明和定义(实现) // 完整地写一个类:类的声明和实现 // 1.类的声明 // 声明对象的属性、行为 // : NSObject 目的是:让Car这个类具备创建对象的能力 @interface Car : NSObject {// 用来声明对象属性(实例变量\成员变量,默认会初始化为0) // @public可以让外部的指针间接访问对象内部的成员变量 @public int wheels; // 轮胎个数 int speed; // 时速(xxkm/h) } // 方法(行为):方法名、参数、返回值(声明、实现) // 只要是OC对象的方法,必须以减号 - 开头 // OC方法中任何数据类型都必须用小括号()扩住 // OC方法中的小括号():括住数据类型 - (void)run; @end // 2.类的实现 // 用来实现@inteface中声明的方法 @implementation Car // 方法的实现(说清楚方法里面有什么代码) - (void)run { NSLog(@"车子跑起来了"); } @end int main() { // 在OC中,想执行一些行为,就写上一个中括号[行为执行者 行为名称] // 利用类来创建对象 // 执行了Car这个类的new行为来创建新对象 // 定义了一个指针变量p,p将来指向的是Car类型的对象 // [Car new]每次都会创建出一个新对象,并且会返回新对象本身(新对象的地址) Car *p = [Car new]; Car *p2 = [Car new]; p2->wheels = 5; p2->speed = 300; [p2 run]; // 给p所指向对象的wheels属性赋值 p->wheels = 4; p->speed = 250; // 给p所指向对象发送一条run消息 [p run]; NSLog(@"车子有%d个轮子,时速位:%dkm/h", p->wheels, p2->speed); return 0; }
面向对象封装的好处
更加接近人类的思考方式
只需要关注对象,不需要关注步骤
对象与函数参数
对象成员变量作为函数参数
指向对象的指针作为函数参数
修改指向指向对象的成员
修改指针的指向
二、 类的声明和实现
1. @interface和@implementation的分工
@interface就好像暴露在外面的时钟表面
@implementation就好像隐藏在时钟内部的构造实现
声明和定义多个类
常见错误
只有类的声明,没有类的实现
漏了@end
@interface和@implementation嵌套
两个类的声明嵌套
成员变量没有写在括号里面
方法的声明写在了大括号里面
/* 方法 1.对象方法都是以减号 - 2.对象方法的声明必须写在@interface和@end之间 对象方法的实现必须写在@implementation和@end之间 3.对象方法只能由对象来调用 4.对象方法归类\对象所有 函数 1.函数能写在文件中的任意位置(@interface和@end之间除外),函数归文件所有 2.函数调用不依赖于对象 3.函数内部不能直接通过成员变量名访问某个对象的成员变量 */ #import <Foundation/Foundation.h> @interface Person : NSObject @end @implementation Person @end @interface Car : NSObject {// 成员变量\实例变量 //int wheels = 4; 不允许在这里初始化 //static int wheels; 不能随便将成员变量当做C语言中的变量来使用 @public int wheels; } - (void)run; - (void)fly; @end int main() { // wheels = 10; /* Car *c = [Car new]; c->wheels = 4; //run(); [c run]; */ void test2(); test2(); return 0; } @implementation Car - ( b29d void) fly { } /* void test2() { NSLog(@"调用了test2函数-%d", wheels); }*/ void test() { NSLog(@"调用了test函数"); } - (void)run { test(); NSLog(@"%d个轮子的车跑起来了", wheels); } @end
语法细节
成员变量不能在{}中进行初始化、不能被直接拿出去访问
方法不能当做函数一样调用
成员变量\方法不能用static等关键字修饰,别跟C语言混在一起(暂时忽略)
类的实现可用写在main函数的后面,主要在声明后面就行了
OC方法和函数的区别
OC方法只能声明在@interface和@end之间,只能实现在@implementation和@end之间。也就是说OC方法不能独立于类存在
C函数不属于类,跟类没有联系,C函数只归定义函数的文件所有
C函数不能访问OC对象的成员
低级错误:方法有声明,但是实现的时候写成了函数
OC的方法注意
方法只有声明,没有实现(经典错误)
方法没有声明,只有实现(编译器警告,但是能调用,OC的弱语法)
编译的时候:访问没有的成员变量直接报错,访问没有的方法,只是警告
@implementation
没有@interface,只有@implementation,也是能成功定义一个类的
@implementation Car : NSObject
{
@public
int wheels; // 多少个轮子
int speed; // 时速
}
(void) run
{
NSLog(@”%i个轮子,%i时速的车子跑起来了”, wheels, speed);
}
@end
@implementation中不能声明和@interface一样的成员变量
三、 方法
设计一个Caculator计算器类,它拥有计算的功能(行为)
1. 不带参数的方法
设计一个返回PI的方法
// 方法声明
- (double)pi;
// 方法实现
- (double)pi
{
return 3.14;
}
带一个参数的方法
设计一个计算平方的方法
// 方法声明
(double)square:(double)number;
// 方法实现
(double)square:(double)number
{
return number * number;
}
带多个参数的方法
设计一个计算和的方法
// 方法声明
(double)sumOfNum1:(double)num1 andNum2:(double)num2;
// 方法实现
(double)sumOfNum1:(double)num1 andNum2:(double)num2
{
return num1 + num2;
}
方法名注意
冒号也是方法名的一部分
同一个类中不允许两个对象方法同名
#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; } @end int main() { JiSuanQi *jsq = [JiSuanQi new]; int a = [jsq sumWithNum1:20 andNum2:5]; //int a = [jsq sum:10 :5]; //int a = [jsq pingFang:10]; //double a = [jsq pi]; NSLog(@"%i", a); return 0; }
四、 匿名对象
属性访问
[Car new]->speed = 200;
方法调用
[ [Car new] run];
#import <Foundation/Foundation.h> @interface Car : NSObject { @public int speed; } - (void)run; @end @implementation Car - (void)run { NSLog(@"速度为%d的车子跑起来了", speed); } @end int main() { /* Car *c; c = [Car new]; c->speed = 250; [c run];*/ // 不要写类似匿名对象这样的代码 // 只要求能说出输出结果 [Car new]->speed = 300; [[Car new] run]; //Car *c = [Car new]; return 0; }
相关文章推荐
- [黑马程序员]11[OC语言]圆,点问题, OC的面向对象程序设计思想和类封装
- 黑马程序员----OC面向对象之类和对象
- 黑马程序员——OC基础---面向对象语法
- 黑马程序员------OC 面向对象和面向过程思想(基础)
- 黑马程序员——OC—OC中面向的对象特征之继承和派生
- 黑马程序员-OC语言基础:面向对象语法 二
- 黑马程序员_OC学习之面向对象理解
- 黑马程序员——OC语言基础篇---面向对象之三大特性
- 黑马程序员-OC语言基础:面向对象语法 四
- 黑马程序员——OC---面向对象之类和对象
- 黑马程序员-OC语言基础:面向对象语法 三
- 黑马程序员---【OC语言】04面向对象之继承与多态
- 黑马程序员—OC—面向对象(二)
- 黑马程序员_OC面向对象之类和对象基础
- 黑马程序员——零基础学习iOS开发——10 Object-C 面向对象思想、OC语法简介、对象、类、
- 黑马程序员-OC的面向对象
- 黑马程序员-IOS-OC基础-面向对象语法一
- 黑马程序员--oc:面向对象语法
- 黑马程序员--学习OC面向对象特性
- 黑马程序员------oc之面向对象特性 封装、多态、继承等