【黑马程序员】---Objective-C面向对象知识总结

来源:互联网 发布:淘宝建盏可靠吗 编辑:程序博客网 时间:2024/06/15 01:59
------- android培训、java培训、期待与您交流! ----------


Objective-C面向对象知识总结


OC是一门面向对象的语言,因此它也有类、对象、静态\动态方法、成员变量的概念

1.类

在oc中,一般有两个文件来描述一个类

(1).h:类的声明文件,用于声明成员变量、方法。类的声明使用关键字@interface@end

(2).m:类的实现文件,用于实现.h中声明的方法。类的实现使用关键字@implementation@end

(3    + 表示方法(静态方法      - 表示对象方法(动态方法)。

(4)oc的成员变量定义跟其它编程语言类似,(实例变量\成员变量,默认会初始化为0)

@interface Car : NSObject{    // @public可以让外部的指针间接访问对象内部的成员变量    @public    int wheels; // 轮胎个数    int speed; // 时速(xxkm/h)}// 方法(行为):方法名、参数、返回值(声明、实现)// 只要是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).h中的方法只是做一个声明,并不对方法进行实现。也就是说,只是说明一下方法名、方法的返回值类型、方法接收的参数类型而已,并不会编写方法内部的代码。

(2)类名的第一个字母必须是大写,不能有下划线

(3)实例变量\成员变量,默认会初始化为0

(4)OC方法中任何数据类型都必须用小括号()括住

(5)默认情况下,实例变量都是protected类型,在.h中声明的所有方法作用域都是public类型,不能更改。

(6)oc中调用方法的形式[行为的执行者 行为名称]。

(7)可以用指向类类型的对象的指针变量访问实例变量,比如p->speed。

(8)在声明实例变量的时候不能对实例变量进行初始化。


2.oc对象跟函数

注意方法跟函数的区别

@implementation Car- (void)run{    NSLog(@"%d个轮子,速度为%dkm/h的车子跑起来", wheels, speed);}@endvoid test(int w, int s){    w = 20;    s = 200;}
心得体会:

(1)对象方法的声明必须写在@interface和@end之间,对象方法的实现必须写在@implementation和@end之间

(2)函数能写在文件中的任意位置(@interface和@end之间除外),函数归文件所有

(3)对象方法只能由对象来调用,对象方法归类\对象所有

(4)函数内部不能直接通过成员变量名访问某个对象的成员变量

(5)不能随便将成员变量当做C语言中的变量来使用


其它知识点:

// 设计一个方法,用来和其他车比较车速,返回车速的差距#import <Foundation/Foundation.h>@interface Car : NSObject{    @public    int speed;}- (int)compareSpeedWithOther:(Car *)other;@end@implementation Car- (int)compareSpeedWithOther:(Car *)other{    // speed    // other->speed    // 返回当前这辆车和other这辆车的速度差距    return speed - other->speed;}@end
(1)注意函数的名称。

(2)函数参数前面加冒号:。

 

类方法

 1> 加号 + 开头
 2> 只能由类(名)来调用
 3> 类方法中不能访问成员变量(实例变量)

// 类方法都是以+开头+ (void)printClassName;
心得体会:

(1)当方法内部不需要使用到成员变量时,就可以改为类方法

(2) 可以允许类方法和对象方法同名

3.匿名对象

    [Car new]->speed = 300;    [[Car new] run];<span style="color:#ff0000;">Car *c = [Car new];</span>
心得体会:

(1)匿名对象每一次[Car new],都会在内存新开辟一段存储空间。每一个[Car new ]对象都不同。

(2)只要求能说出输出结果, 不要写类似匿名对象这样的代码


4.封装

隐藏内部实现,稳定外部接口.

(1) set方法, 提供一个方法给外界设置成员变量值,可以在方法里面对参数进行相应过滤

(2) get方法,返回对象内部的成员变量

@interface Student : NSObject{    int _no;    Sex _sex;}// sex的set和get方法- (void)setSex:(Sex)sex;- (Sex)sex;// no的set和get方法- (void)setNo:(int)no;- (int)no;@end
心得体会:

(1)方法名必须以set开头, set后面跟上成员变量的名称,成员变量的首字母必须大写,形参的名称不能跟成员变量名一样

(2)get方法肯定有返回值,返回值类型肯定与成员变量类型一致

(3)成员变量的命名规范:一定要以下划线 _ 开头


5.继承

子类继承父类,子类可以直接复用父类中的成员.子类继承父类所有方法的声明和实现。

@interface Animal : NSObject{    int _age;}- (void)setAge:(int)age;- (int)age;@end
@interface Cat : Animal@end@implementation Cat@end
心得体会:

(1)子类可以拥有父类中的所有成员变量和方法

(2)基本上所有类的根类是NSObject

(3)当两个类拥有相同属性和方法的时候,就可以将相同的东西抽取到一个父类中

(4) /继承:xx 是 xxx        组合:xxx 拥有 xxx


重写:子类重新实现父类中的某个方法,覆盖父类以前的做法

 1> 父类必须声明在子类的前面
 2> 子类不能拥有和父类相同的成员变量
 3> 调用某个方法时,优先去当前类中找,如果找不到,去父类中找


6.多态

父类类型的指针指向子类对象

void feed(Dog *d){    [d eat];}void feed2(Cat *c){   [c eat];}// 如果参数中使用的是父类类型,可以传入父类、子类对象void feed(Animal *a){    [a eat];}
心得体会:

(1)如果函数\方法参数中使用的是父类类型,可以传入父类、子类对象

(2)父类类型的变量 不能 直接调用子类特有的方法。必须强转为子类类型变量后,才能直接调用子类特有的方法

(3)编译看左,运行看右,调用方法时会检测对象的真实形象


7.self和super

self:
(1)谁调用了当前方法,self就代表谁-------如果self出现在对象方法中,就代表当前对象;如果self出现在类方法中,就代表当前类。
(2)self支持赋值操作,也可以被用作返回值,例如:"Car *c = self"  和 ""return self"
(3)通过self可以调用类的实例变量和方法,例如:"self->成员变量名" 和 “ [self 方法名]”。

super:
(1)super只能被用于调用父类的方法。-------super处在对象方法中,那么就会调用父类的对象方法,super处在类方法中,那么就会调用父类的类方法
(2)不能通过super完成赋值,也不能把方法的返回值指定为super。





0 0
原创粉丝点击