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

------- 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);
}
@end
void 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值