黑马程序员-OC之面向对象的三大特性:封装、继承和多态

------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------

面向对象的三大特性:封装,继承,多态

下面主要学习封装

1 set方法

Set方法的作用:提供一个方法给外部对成员变量值进行设置

set方法的命名规则:

1>  方法名必须以set开头

2>  set后面跟上变量名的首字母必须大写

3>  返回值一定是void

4>  一定要传递一个或一个以上个的参数,且形参名类型与必须要和成员变量名的类型相一致

5>  形参的名字不能和成员变量名相同

2.get方法

get方法的作用:提供一个方法给外部使用对象内部成员变量值,与set方法一起使用,当然也可以单独使用。

get方法的命名规则:

1>  方法必须返回值

2>  方法名和成员变量名一致

3>  方法不带有参数

总结:set方法和get方法都是封装中常使用的方法,这样的好处就是可以隐藏对象中的成员变量,防止被随意修改,从而提高程序的安全性。

3.OC语言是一门弱语法,在调用方法的时候,即使没有声明,编译的时候也只是提示警告,而且在链接的时候也能通过(C链接无法通过)。原因是在OC中,方法是在程序运行的时候才会去找相应的方法,如果找不到,程序就会崩溃,导致运行时候闪退。

4.类方法和对象方法

1>类方法

a、以“+”号开头;

b、类方法只能由类名来调用;

c、类方法不能调用实例变量(成员变量)

好处:

不依赖于对象,执行的效率高,所以能用类方法,尽量用类方法;

使用场合:

    当方法内部在不需要使用成员变量时,都可以改为使用类方法。

2>对象方法

a、 以“-”号开头

b、 对象方法只能由对象调用

c、 可以使用对象中的成员变量(实例变量)

 

总结:OC中,方法有类方法和对象方法,区别在定义和声明时候,使用的符号不一样。在方法中,OC允许类方法和对象方法名字相同。其实类方法和对象方法可以这样理解,类方法可以比作成电脑能实现什么功能,而对象方法就可以比作电脑里面的内存等其它对象能实现什么功能,所以,类方法是一个较整体的实现方法,使用的效率当然会比对象方法还要高。

下面主要分析类方法和对象方法在内存中的位置,可以看出person对象是从peson类中NEW出来的,然后方法都会方法类里面,也就是说person类包含了类方法和对象方法。对象的成员变量当然是在person类NEW出来的对象中,这就说明了类方法根本无法使用成员变量(实例变量),因为它是在对象里面的。而类跟对象的联系是通过一个系统自动开辟的指针isa来的。

注意:类方法可以被对象方法调用,类方法调用类本身的方法,会导致死循环。


在OC中 

1 self是一个指针,在每一个方法中都有一个self指针

2 self可以调用所有的方法中(对象方法和类方法),但是不能出现在函数中

3 self指向调用者。(谁调用它就指向谁)

4 可以使用self->成员变量 访问成员变量,可以使用[self 方法名]调用方法

注意:self在方法的使用中,特别容易造成死循环

3.  继承

1>  继承的优点:

1、代码的可重用性

2、父类的属性和方法可用于子类

3、设计应用程序变得更加简单

4、可以轻松地自定义子类

2>  缺点:耦合性太强(就是子类跟父类之间关系很紧密,父类的改变,会导致子类出错)

注意:

a、 父类的声明必须写在子类前;

b、 子类的成员变量(实例属性)不能和父类的同名

c、 调用某个对象的方法时,优先去当前的类中找,如果找不到再去父类中找     

3>  继承的重写:子类重新实现父类的某个方法,覆盖掉父类以前的方法

4>  继承在内存中的过程:

 

分析:从图中可以看出,Person student的父类,而NSObject又是Person的父类,

类和类之间通过superclass指针来联系,这样student 也可以继承NSObject 中的new类方法。对象会通过isa指针与其类相联系。而子类和父类又是继承关系,因此,对象就相当于获得了父类的成员变量和方法了。

继承的使用场合

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

2>  当A类完全拥有B类中的部分属性和方法时,可以考虑让B类继承A类;

3>  但是并不是所有类似的情况都可以这样,具体问题还是得具体分析,例如

@interface  Score : NSObject

{

      int _cScore;

      int _ocScore;

}

@end

@interfaceStudent : NSObject

{

      int _cScore;

      int _ocScore;

}

@end

如果这样让Student来继承Score明显不合理的,因为学生继承分数,不符合逻辑。这时就可以用另外一个专业术语:组合。

可以让Person类拥有Score类;格式: Score* _score;

组合和继承该怎么用,需要看情况,具体问题具体分析。

 

关键字super的作用

1.  直接调用父类中的某个方法

2.  Super处在对象方法中,调用的是父类的对象方法,处在类方法中,调用的是类方法;

3.  使用场合:子类重写父类是,先调用父类的方法,再加入子类要实现的方法;

 

 

多态的概念:同一个实现接口,使用不同的实例而执行不同的操作。首先要有继承,才有多态。

多态的特点:父类指针指向子类对象,调用方法时会根据实际创建对象类型动态决定使用哪个对象的真实形象。

多态的好处:如果函数\方法参数中使用的是父类类型,可以传入父类、子类对象,这样可以节省重复的代码。

多态的局限性:OC是弱语法,父类类型的指针变量,用来调用子类的方法,虽然编译器会报了警告,但是程序依然能运行。但是在编程的时候不要这样做,因为代码要规范。由于父类不能访问子类的属性(但可以考虑强制转换)例强制转换,其实是做给编译器看的:

Animal*aa  = [Dog new]; Dog *dd = (Dog *)aa;

                         


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值