黑马程序员-OC的面向对象
来源:互联网 发布:男生虚胖的原因知乎 编辑:程序博客网 时间:2024/05/16 05:05
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
一.什么是面向对象
面向对象是指一种程序设计范型,同时也是一种程序开发的方法,将抽像的事物用计算机能理解的方式描述和实现的一种概念。
二.面向对象与面向过程编程语言有什么不同
面向对象更侧重如抽象,往往需要先抽象出一个对象,通过对象的行为的实现来达到目的,面向过程则侧重于过程,往往先有一个入口,然后按步就班的就一步步实现。
三.面向对象的好处
1、易维护
采用面向对象的设计结构,就可以使用一种经典的设计模式,可读性高,而且因为继承,协议,接口等存在,即使改变需要,也可能只需要维护少数模块。
2、兼容性强
在设计时,因为其模块化,所以可能重复利用,并且互不干扰,这样就可以让代码相互兼容。
3、效率高
在软件开发时,可以将常用的模块封装,当需要时就嵌入进去,使用这样的方法,可免去编写重复的代码。
4、易扩展
由于继承、封装、多态的特性,自然设计出高内聚、低耦合的架构,使得架构更灵活、更容易扩展。
四,面向对象的原则
找出应用中可能需要变化之处,把它们独立起来,不要和那些不需要变化的代码混在一起,封装那些可能变化的代码,以便轻易改动和扩展,并不影响其它的代码。
五.设计原则
针对接口编程而不针对实现编程
六.常用术语
1.面向过程 Procedure Oriented
2.面向对象 Object Oriented 简称oo
3.面向对象编程 Object Oriented Programming 管称oop
七.面向对象的三大特性
1.封装:用抽象的数据类型将数据和基于数据的操作封装在一起,数据被保护在抽象数据类型内部。
2.继承:子类拥有父类的所有数据和操作。
3.多态:一个程序中同名的不同方法共存的情况。
八.设计类的三个步骤
1.类的名称
2.类的属性
3.类的行为(功能)
类与对象的关系
1.oc中的因相当于图纸,用来描述一类事物,也就是说,要想创建对象,必须先有类
2.oc利用类来创建对象,对象是类的具体存在。
3.因此,面向对象解决问题应该是先考虑需要设计哪些类,再利用类创建多少个对象。
九.OC例子
第1个oc类程序 第一个类的声明与实现
bogon:02oc whome$ touch 07oc.m
bogon:02oc whome$ open 07oc.m
试验性例子。
//2.类的实现
bogon:02oc whome$ cc 07oc.m -framework Foundation
07oc.m:20:1: error: expected identifier or '('
{
^
07oc.m:13:12: warning: class 'Car' defined without specifying a base class
[-Wobjc-root-class]
@interface Car
^
07oc.m:13:15: note: add a super class to fix this problem
@interface Car
^
: NSObject
07oc.m:29:9: error: interface type cannot be statically allocated
Car s = new Car();
^
*
07oc.m:29:13: error: use of undeclared identifier 'new'
Car s = new Car();
^
07oc.m:30:7: error: property 'wheels' not found on object of type 'Car *'; did
you mean to access instance variable 'wheels'?
s.wheels=0;
~^
->
07oc.m:31:7: error: property 'speed' not found on object of type 'Car *'
s.speed = 2;
^
07oc.m:32:35: error: property 'wheels' not found on object of type 'Car *'; did
you mean to access instance variable 'wheels'?
NSLog(@"wheels=%d,speed=%d",s.wheels,s.speed);
~^
->
1 warning and 6 errors generated.
正常的程序:
bogon:02oc whome$ cc 07oc.m -framework Foundation
bogon:02oc whome$ ./a.out
2014-09-11 23:31:44.546 a.out[640:507] wheels=0,speed=2
2014-09-11 23:31:44.555 a.out[640:507] 跑起来了
第2个oc类程序 方法和成员变量
bogon:~ whome$ cd Desktop/oc/02oc
bogon:02oc whome$ touse 08oc.m
bogon:02oc whome$ open 08oc.m
bogon:02oc whome$ cc 08oc.m -framework Foundation
bogon:02oc whome$ ./a.out
2014-09-14 19:51:03.707 a.out[465:507] 小明身高=170,体重=120,开始走了
2014-09-14 19:51:03.709 a.out[465:507] 小明身高=160,体重=100,开始走了
//关于类指针的互相调用
person *p2 = [person new];
p2->height=20;
p2->weight=40;
person *p3 = [person new];
p3->height = 30;
p3->weight = 50;
//当p2不再指向原先p2的对象,指向p3后,它修改的将是p3所指的对象
p2=p3;
p2->height = 40;
[p2 walk];
[p3 walk];
2014-09-14 20:29:15.527 a.out[519:507] 小明身高=40,体重=50,走了一段路
2014-09-14 20:29:15.528 a.out[519:507] 小明身高=40,体重=50,走了一段路
2014-09-15 00:00:12.178 a.out[634:507] 6个轮子,时速为100km/h test
2014-09-15 00:00:12.180 a.out[634:507] 5个轮子,时速为250km/h,跑起来了
常见错误
只有类的声明@interface没有类的实列@implementation
漏了@end
@interface和@implementation嵌套
只有代码块{}没有方法名
两个类的声明嵌套
成员变量没有写在括号里
方法的声明写在了大括号里面
语法细节
成员变量不能在{}中初始化,不能被直接拿出来访问
方法不能当做函数一样调用
成员变量\方法不能用static等关键字修饰,不能跟c语言混在一起
类的实现@implementation可以写在main函数的后面,主要在声明后面就行了。
oc方法和函数的区别
oc方法只能声明在@interface和@end之间,只能实现在@implementation和@end之间,也就是说oc方法不能独立于类存在
c函数于属于类,跟类没有联系,c函数只归定义函数的文件所有
关于类在内存的方式
类有自己的内存空间,每一次[class new]将复制一个对象并存放在另一个内存区域,这里面放着类的对象
类的对象地址由类的指针来进行访问
关于类的属性和方法的调用,先由类的指针查询类内存中的声明,然后在类对象的内存中读取对应的实现。
面向对象是指一种程序设计范型,同时也是一种程序开发的方法,将抽像的事物用计算机能理解的方式描述和实现的一种概念。
二.面向对象与面向过程编程语言有什么不同
面向对象更侧重如抽象,往往需要先抽象出一个对象,通过对象的行为的实现来达到目的,面向过程则侧重于过程,往往先有一个入口,然后按步就班的就一步步实现。
三.面向对象的好处
1、易维护
采用面向对象的设计结构,就可以使用一种经典的设计模式,可读性高,而且因为继承,协议,接口等存在,即使改变需要,也可能只需要维护少数模块。
2、兼容性强
在设计时,因为其模块化,所以可能重复利用,并且互不干扰,这样就可以让代码相互兼容。
3、效率高
在软件开发时,可以将常用的模块封装,当需要时就嵌入进去,使用这样的方法,可免去编写重复的代码。
4、易扩展
由于继承、封装、多态的特性,自然设计出高内聚、低耦合的架构,使得架构更灵活、更容易扩展。
四,面向对象的原则
找出应用中可能需要变化之处,把它们独立起来,不要和那些不需要变化的代码混在一起,封装那些可能变化的代码,以便轻易改动和扩展,并不影响其它的代码。
五.设计原则
针对接口编程而不针对实现编程
六.常用术语
1.面向过程 Procedure Oriented
2.面向对象 Object Oriented 简称oo
3.面向对象编程 Object Oriented Programming 管称oop
七.面向对象的三大特性
1.封装:用抽象的数据类型将数据和基于数据的操作封装在一起,数据被保护在抽象数据类型内部。
2.继承:子类拥有父类的所有数据和操作。
3.多态:一个程序中同名的不同方法共存的情况。
八.设计类的三个步骤
1.类的名称
2.类的属性
3.类的行为(功能)
类与对象的关系
1.oc中的因相当于图纸,用来描述一类事物,也就是说,要想创建对象,必须先有类
2.oc利用类来创建对象,对象是类的具体存在。
3.因此,面向对象解决问题应该是先考虑需要设计哪些类,再利用类创建多少个对象。
九.OC例子
第1个oc类程序 第一个类的声明与实现
bogon:02oc whome$ touch 07oc.m
bogon:02oc whome$ open 07oc.m
试验性例子。
#import <Foundation/Foundation.h>//声明对象的属性,行为@interface Car{ //用来声明对象属性 int wheels;//轮胎个数 }{ int speed;//时速(xxkm/h)}@end
//2.类的实现
@implementation Car@end;int main(){ Car s = new Car(); s.wheels=0; s.speed = 2; NSLog(@"wheels=%d,speed=%d",s.wheels,s.speed); return 0;}
bogon:02oc whome$ cc 07oc.m -framework Foundation
07oc.m:20:1: error: expected identifier or '('
{
^
07oc.m:13:12: warning: class 'Car' defined without specifying a base class
[-Wobjc-root-class]
@interface Car
^
07oc.m:13:15: note: add a super class to fix this problem
@interface Car
^
: NSObject
07oc.m:29:9: error: interface type cannot be statically allocated
Car s = new Car();
^
*
07oc.m:29:13: error: use of undeclared identifier 'new'
Car s = new Car();
^
07oc.m:30:7: error: property 'wheels' not found on object of type 'Car *'; did
you mean to access instance variable 'wheels'?
s.wheels=0;
~^
->
07oc.m:31:7: error: property 'speed' not found on object of type 'Car *'
s.speed = 2;
^
07oc.m:32:35: error: property 'wheels' not found on object of type 'Car *'; did
you mean to access instance variable 'wheels'?
NSLog(@"wheels=%d,speed=%d",s.wheels,s.speed);
~^
->
1 warning and 6 errors generated.
正常的程序:
#import <Foundation/Foundation.h>/* 类名:Car 属性:轮胎个数,时速(速度) 行为:跑 *///完整地写一个函数:函数的声明和定义(实现)//完整地写一个类:类的声明和实现//1.类的声明//声明对象的属性,行为//:NSObject 目的是:让Car这个类具备创建对象的能力@interface Car : NSObject{ @public //@public可以让外部的指针间接访问对象内部的成员变量 //用来声明对象属性(成员变量,默认会初始化为0) int wheels;//轮胎个数 int speed;//时速(xxkm/h) }//方法(实为),跟函数类似,都有名称,参数与返回值(声明和实现)//只要是oc对象的方法,必须已减号-开头//oc方法中,作何数据类型都必须用小括号()括住//oc方法中,括号的作用只有:括住数据类型-(void)run;@end
//2.类的实现@implementation Car//方法的实现-(void)run{ NSLog(@"跑起来了");}@end;int main(){ //在oc中,想执行一些行为,就写上一个中括号[行为执行者 行为名称] //利用类来创建对象 //执行了Car这个类的new行为来创建新对象 //定义了一个Car指针变量s,s将来指向的是Car类型的对象 //[Car new]每次都会创建出一个新对象,并且会返回新对象本身(新对象的地址) Car *s = [Car new]; s->wheels=0; s->speed = 2; NSLog(@"wheels=%d,speed=%d",s->wheels,s->speed); //方法的执行 //给s所指的对象发送一条run消息 [s run]; return 0;}
bogon:02oc whome$ cc 07oc.m -framework Foundation
bogon:02oc whome$ ./a.out
2014-09-11 23:31:44.546 a.out[640:507] wheels=0,speed=2
2014-09-11 23:31:44.555 a.out[640:507] 跑起来了
第2个oc类程序 方法和成员变量
bogon:~ whome$ cd Desktop/oc/02oc
bogon:02oc whome$ touse 08oc.m
bogon:02oc whome$ open 08oc.m
#import <Foundation/Foundation.h>/* 类名称 (人)person 类属性 (成员变量,实例变量)身高体重 类行为 (走)walk*/@interface person : NSObject{ //属性,身高,体重 @public int height; int weight;}//走方法- (void) walk;@end
//类的实现//实现@interface中声明的方法@implementation person//在oc的类里面小括号只用来括住数据类型-(void) walk{ //类对象调用类属性无需再次引用 NSLog(@"小明身高=%d,体重=%d,开始走了",height,weight);}@end
int main(){ //用指针调用新创建的类对象 person *p = [person new]; //给类对象属性赋值 p->height=170; p->weight=120; //调用类对象属性方法 [p walk]; //第二个类对象 person *p1 = [person new]; p1->height=160; p1->weight=100; [p1 walk]; }
bogon:02oc whome$ cc 08oc.m -framework Foundation
bogon:02oc whome$ ./a.out
2014-09-14 19:51:03.707 a.out[465:507] 小明身高=170,体重=120,开始走了
2014-09-14 19:51:03.709 a.out[465:507] 小明身高=160,体重=100,开始走了
//关于类指针的互相调用
person *p2 = [person new];
p2->height=20;
p2->weight=40;
person *p3 = [person new];
p3->height = 30;
p3->weight = 50;
//当p2不再指向原先p2的对象,指向p3后,它修改的将是p3所指的对象
p2=p3;
p2->height = 40;
[p2 walk];
[p3 walk];
2014-09-14 20:29:15.527 a.out[519:507] 小明身高=40,体重=50,走了一段路
2014-09-14 20:29:15.528 a.out[519:507] 小明身高=40,体重=50,走了一段路
/* 类名称 (人)person 类属性 (成员变量,实例变量)身高体重 类行为 (走)walk*/@interface person : NSObject{ //属性,身高,体重 @public int height; int weight;}//走方法- (void) walk;//多个方法- (void) eat;@end
//类的实现//实现@interface中声明的方法@implementation person//在oc的类里面小括号只用来括住数据类型-(void) walk{ //类对象调用类属性无需再次引用 NSLog(@"小明身高=%d,体重=%d,走了一段路",height,weight);}//多个方法实现-(void) eat{ //类对象调用类属性无需再次引用 NSLog(@"小明身高=%d,体重=%d,吃了点东西",height,weight);}@end
#import <Foundation/Foundation.h>@interface Car : NSObject{ @public //轮子 int wheels; //时速 int speed;}-(void)run;@end
@implementation Car- (void)run{ NSLog(@"%d个轮子,时速为%dkm/h,跑起来了",wheels,speed);}@end
void test(int w,int s){ w=6; s=100; NSLog(@"%d个轮子,时速为%dkm/h test",w,s); }void test1(Car *newCar){ newCar->wheels=5;}void test2(Car *newCar){ Car *c2 = [Car new]; c2->wheels = 5; c2->speed = 300; newCar = c2; newCar->wheels = 6;}int main(){ Car *c =[Car new]; c->wheels = 4; c->speed = 250; //c = 4,250 test(c->wheels,c->speed); //c不变 test1(c); //c= 5,250 test2(c); //c不变,同时test2函数域里的newCar指向c的对象 [c run]; return 0;}
2014-09-15 00:00:12.178 a.out[634:507] 6个轮子,时速为100km/h test
2014-09-15 00:00:12.180 a.out[634:507] 5个轮子,时速为250km/h,跑起来了
常见错误
只有类的声明@interface没有类的实列@implementation
漏了@end
@interface和@implementation嵌套
只有代码块{}没有方法名
两个类的声明嵌套
成员变量没有写在括号里
方法的声明写在了大括号里面
语法细节
成员变量不能在{}中初始化,不能被直接拿出来访问
方法不能当做函数一样调用
成员变量\方法不能用static等关键字修饰,不能跟c语言混在一起
类的实现@implementation可以写在main函数的后面,主要在声明后面就行了。
oc方法和函数的区别
oc方法只能声明在@interface和@end之间,只能实现在@implementation和@end之间,也就是说oc方法不能独立于类存在
c函数于属于类,跟类没有联系,c函数只归定义函数的文件所有
关于类在内存的方式
类有自己的内存空间,每一次[class new]将复制一个对象并存放在另一个内存区域,这里面放着类的对象
类的对象地址由类的指针来进行访问
关于类的属性和方法的调用,先由类的指针查询类内存中的声明,然后在类对象的内存中读取对应的实现。
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
0 0
- 黑马程序员-OC的面向对象
- 黑马程序员---oc--面向对象
- 黑马程序员--------OC面向对象的三大特性
- 黑马程序员——OC面向对象的基础认识
- 黑马程序员--oc:面向对象语法
- [黑马程序员][OC]面向对象-思想
- 黑马程序员一OC面向对象语法
- 黑马程序员 OC基础: 面向对象(一)
- 黑马程序员IOS-OC语言-面向对象
- 黑马程序员--学习OC面向对象特性
- 黑马程序员-oc面向对象特性
- 黑马程序员-OC回顾-面向对象
- 黑马程序员——OC—OC中的面向对象
- 黑马程序员——OC—OC中面向对象的特性之封装
- 黑马程序员——OC—OC中面向的对象特征之继承和派生
- 黑马程序员---【OC语言】02面向过程以及面向对象
- 黑马程序员——OC---面向对象之类和对象
- 黑马程序员----OC面向对象之类和对象
- 图的拓扑排序
- Android 扫描二维码实现网页登录
- JaxWS+Spring实现WebService
- android studio gradle 配置修改
- [LeetCode]Copy List with Random Pointer
- 黑马程序员-OC的面向对象
- 导入开源库到基于Android Studio构建的项目中
- 【转载】H.264中NAL、Slice与frame意思及相互关系
- tiny6410按键驱动(一)---驱动框架
- 编写函数模拟掷骰子的游戏(两个骰子)。第一次掷的时候,如果点数之和为7或11则获胜;如果点数之和为2、3或12则落败;其他情况下的点数之和称为“目标”,游戏继续。在后续的投掷中,如果玩家再次掷出“目标
- WebServices测试之三-----suds测试WEBSERVICES
- kinect的各种事情。。。
- Binary Tree Level Order Traversal (Java)
- Linux backtrace函数追踪函数调用堆栈——定位段错误