zoukankan      html  css  js  c++  java
  • 黑马程序员——面向对象编程三大特性

    黑马程序员——面向对象编程三大特性

     

    ------- android培训IOS培训、期待与您交流! ----------

    面向对象编程三大特性:封装,继承,多态,(抽象)

    ***封装的概念与原理***

       封装是面向对象的特性之一

       封装的好处:降低数据被无用的可能性,保证数据安全性

       不封装的缺点:会把自己的属性暴露给外部,失去对该属性的管理权

    封装原理:实例变量默认只能被当前类的对象方法访问

    **封装实现**

    定义设置实例变量(setter)方法和访问实例变量(getter)方法

     

    1)setter(设置器)

       在开发过程中,考虑到安全性要求,一般不在成员变量面前使用@public、@protected等关键字修饰,而是使用set方法来为对象提供成员变量的值。在set方法内部可以对一些不合理的赋值进行过滤筛选

       set方法作用:为外界提供一个设置成员变量值的方法

       命名规范:

       1)方法名必须以set开头

       2)set后面跟上成员变量名称,首字母大写:_name    setName

       3)返回值一定是void,不能有返回值

       4)一定要接受一个参数,而且参数类型需要成员变量的类型一致

       5)形参名不能和成员变量名一样(官方推荐成员变量名前加_)

    对set中,成员变量设置值,要用set方法

     

    2)getter(访问器)

       命名规范:

       1)一定有返回值,返回值类型和成员变量一致

       2)方法名和成员变量一样(去掉下划线的)

       3)不需要接受任何参数

       4)get方法实现中,一定是返回实例变量值

       5)是一个对象方法

    以后获取值,统一使用get方法

     1 #import <Foundation/Foundation.h>
     2 @interface Person:NSObject
     3 {
     4    //年龄
     5    int _age;
     6    //身高
     7    float _height;
     8 }
     9 //给每一个实例变量定义两个方法:设置变量的方法(set),获取变量值得方法(get)
    10 //set规范:
    11 /*
    12 1)一定是一个对象方法
    13 2)返回值一定是void,不能有返回值
    14 3)方法名必须以set开头
    15 4)set后面跟上成员实例变量名称,首字母大写
    16 5)一定有参数,而且参数类型需要成员变量的类型一致
    17 6)形参名一般是去掉下划线的实例变量名
    18 7)形参名不能和实例变量同名
    19 8)set方法实现中,一定要用形参给实例变量赋值
    20 */
    21 -(void)setAge:(int)age;
    22 -(void)setHeight:(float)height;
    23 /*get命名规范:
    24 1)一定有返回值,返回值类型和成员变量一致
    25 2)方法名和成员变量一样(去掉下划线的)
    26 3)不需要接受任何参数
    27 4)get方法实现中,一定是返回实例变量值
    28 5)是一个对象方法
    29 */
    30 -(int)age;
    31 -(float)height;
    32 @end
    33 @implementation Person
    34 //set方法实现
    35 //set方法实现中,一定要用形参给实例变量赋值
    36 -(void)setAge:(int)age{
    37    _age=age;
    38    }
    39 -(void)setHeight:(float)height{
    40    _height=height;
    41    }
    42 //get方法实现
    43 //get方法实现中,一定是返回实例变量值
    44 -(int)age{
    45    return _age;
    46    }
    47 -(float)height{
    48    return _height;
    49    }
    50 @end
    51 int main (int argc, const char *argv[])
    52 {
    53     NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];                        
    54     //在此处输入Objective-C代码
    55    Person *p=[Person new];
    56    [p setAge:20];
    57    [p setHeight:2.12f];
    58    NSLog(@"%d,%.2f",[p age],[p height]);
    59     [pool drain];
    60     return 0;
    61 }

     

    类的继承与派生

    ***继承***

       概念:类B继承了类A, 那么类B具有类A的所有属性和方法。A派生了B

    优缺点:

       继承的好处: 子类拥有父类的所有成员变量和方法, 减少重复代码. 建立类之间的关系。

       继承的缺点: 代码耦合性太强 (类之间的关系太紧密, 如果某个类坏了, 另一个类会受影响)。

       NSObject是基类, 几乎所有的类最终都是继承于它。

       继承注意事项:

       1、子类不能定义和父类同名的变量,但可以继承父类的变量

       2、OC类支持单一继承,不支持多继承,只能有一个父类

       3、OC支持多层继承

    ***多态***

    概念:多态就是某一类事物的多种形态,不同的对象以自己的方式去响应相同名称方法的能力成为多态

     

    条件:有继承关系,有方法重写,

         父类的指针指向子类函数的对象

       Dog *g=[Dog new];

       Zeo *z=[Dog new];

    优点:简化编程接口,容许在类与类之间重用一些习惯性的命名

    @interface Animal:NSObject

    -(void)run;

    @end

    @implementation Animal

    -(void)run{

     NSLog(@"动物在跑");

    }

    @end

    ********狗*******

    子类继承不用再声明了

    @interface Dog:Animal

    -(void)run;//(可以不用写)

    @end

    @implementation Dog

    -(void)run{

     NSLog(@"狗在跑");

    }

    @end

    ********猫*******

    @interface Cat:Animal

    -(void)run;//(可以不用写)

    @end

    @implementation Cat

    -(void)run{

     NSLog(@"猫在跑");

    }

    @end

    **********不使用多态************

    Animal *ani=[Animal new];

    [ani run];

    Dog *dog=[Dog new];

    [dog run];

    Cat *cat=[Cat new];

    [cat run];

    ***********使用多态**********

    //父类指针指向子类对象

    Animal *a1=[Dog new];

    [ani run];//狗在跑

    Animal *a2=[Cat new];

    [ani run];//猫在跑

     

    多态注意:

    1、如果存在多态,父类是可以访问子类特有的方法

       但是编译器会报错,需要强制转换:[(子类名 *)指针名 子类特有属性];

    2、如果不存在多态,父类不可以访问子类特有方法

    ------- android培训IOS培训、期待与您交流! ----------

  • 相关阅读:
    一本通1268 完全背包问题
    一本通1267 01背包
    合并石子1,2
    求最长不下降子序列++
    数字金字塔升级版
    一本通1354 括弧匹配检验
    一本通1353表达式括号匹配
    一本通1357车厢调度
    Centos查看端口占用情况和开启端口命令
    centos后台运行python程序
  • 原文地址:https://www.cnblogs.com/gaozp/p/4904616.html
Copyright © 2011-2022 走看看