美文网首页
面向对象的三大特性

面向对象的三大特性

作者: 小李不木 | 来源:发表于2019-06-10 12:53 被阅读0次

    oc中面向对象有三大特性,为封装,继承,多态。   封装也是成员变量的封装(保护成员变量不能被外界随便赋值。)

    1: 封装

    1>:set 方法:给外界提供一个方法给外界设置成员变量的值。

                      方法名必须以set 开头。

                      set 后面跟上成员变量名,且成员变量名首字母必须大写。

                      set 方法返回值类型必为void。

                      一定要接收一个参数,且参数类型跟成员变量类型一致。

                     形参的名称不能与成员变量名一样。

    在 set 方法实现中可以对参数进行过滤。成员便令不能用@public 时,成员变量可被外面的指针变量任意赋值。

    set 方法可以监听成员变量的改变。

    2>:  get 方法:  返回对象内部的成员的变量

                                 肯定有返回值,且返回值类型与成员变量类型一致。

                                 不需要有形参。

                                 方法名就是成员变量名。

    封装有set 方法来设置成员变量,用 get 方法来访问成员变量。把对象的成员变量隐藏在里面,不显示细节。保证数据的安全性。

    只读:  只允许外界访问对象的某个属性,不允许外界修改这个成员变量的值。这时可以只提供get 方法不提供set 方法。

    成员变量的命名,必须要以下划线开头,这样可以跟局部变量区分开来,还跟get 方法区分开。带下划线的一般都是成员变量。

    oc是弱语法,oc中的方法调用时动态检测的,运行时的过程中才会检测对象有没有实现相应的方法。

    例如:

    @interface  Person  : NSObject 

     @end 

    @implementation   Person 

         @end 

    int  main ()

    {

        Person  * s =   [ person  new ];

     [s  test ];

      return 0;

         }

     这个程序中类的声明中什么也没有。类的实现也是空的。可是编译时只有一个警告,如果加上test 方法的声明,则编译无错误。链接时也可以通过,可是运行时会出现系统崩溃。因为找不到test 方法。  如果没有 test 方法的声明,但是有类的实现也是可以的,但是此时,类的实现必须在 main  函数之前。但是这样不规范、

    封装的好处:把一个功能封装到一个方法中去。

                            过滤不合理的值。

                             让外界不必关注内部的细节。

    类方法:可以直接用类名调用的方法。类本身会在内存中占据存贮空间,里面有方法的列表。

    类方法以加号开头,只能让类调用,类方法可以与对象方法同名。在类方法中不能直接调用成员变量,。

    例如: 

     + void  run 

    {

      NSLog (@''  跑起来了");

    }

      类方法的好处:

       不依赖于对象,执行效率高。

      能用类方法尽量类方法。

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

      工具类:基本没有成员变量,里面的方法基本都是类方法。

     易错:

    + void  run 

    {  

     [  person  run  ];

      NSLog (@''  跑起来了");

    }

        运行时什么也不输出,类方法自己调用自己,死循环。

    + void  run 

    {  

    NSLog (@''  跑起来了");

     [  person  run  ];

     }

    运行中先输出,在自己调用自己,也是死循环。

      self  关键字

    当成员变量与局部变量同名时,采取就近原则。访问的事局部变量。用self 访问成员变量可以区分同名的局部变量。

    self 只能出现在oc方法中,不能在函数中使用。

    self -> 成员变量名: 访问当前对象内部的成员变量。

    [ self  方法名];

    //   谁调用了当前方法 ,self 就代表谁,类方法中就代表类,对象方法中就代表方法。

    - void  run 

    {  

    NSLog (@''  跑起来了");

     [  self   run  ];

     } 

    死循环自己调用自己.

    2:继承

    继承是类和类之间的关系

    例如:

     @interface  Person  : NSObject 

                {

                  int  age ;

                  double  weight;

               }

             - void  test ;

                @end 

    @implementation   Person 

    - void  test 

    NSLog (@''  调用 了人的 test 函数");

    }

         @end 

    @interface   student  : Person 

                @end 

    @implementation   Person 

    - void  test 

    NSLog (@''  调用 了学生的 test 函数");

    }

         @end 

    继承的好处:student  继承了person 的类,student 成为子类,person 成为父类。

     注意: 父类应写在子类之前,因为编辑器是从上往下编译的,所以父类先定义,子类才能使用。

                  oc中不允许父类和子类中有相同的成员变量。

                 子类中允许子类跟父类中有相同的实现方法、

               如果在子类中调用某个方法,会优先在子类中找有没有这个方法的实现。找不到的话就去父类中找。每个类中都有一个super 指针,指向它的父类。 也可以在父类中声明某个方法,但不在父类中实现。在子类中实现。然后在子类中调用。但是编译时会有警告。

            子类重现实现父类中的某个方法,会覆盖父类的方法,优先使用子类的。

      注意:

    1: 父类必须声明在子类之前,实现可在子类后面。

    2:调用某个对象的方法时,会优先去当前对象对应的类中找,如果找不到就顺着super 指针去父类中找。

       继承的好处: 抽取了重复代码,建立了类之间的关系。

                   缺点: 类之间的耦合性太强。

     使用场合:

    1: 当两个类拥有相同的属性和方法时,就可以将相同的东西放在一个父类中。

    2:当A类拥有B类的部分属性和方法时,可以考虑让B类继承A类。

    使用注意:

         @interface Score: NSObject

                {

                  int  -cscore ;

                   int  -ocscore;

               }

             - void  test ;

                @end 

    @implementation   Score

    - void  test 

    NSLog (@''  调用 了test 函数");

    }

         @end 

    @interface Student: NSObject

                {

                  int  -cscore ;

                   int  -ocscore;

               }

             - void  test ;

                @end 

    @implementation   Student

    - void  test 

    NSLog (@''  调用 了人的 test 函数");

    }

         @end 

    虽然这两个类具有相同的属性,可是不能用student 继承score ,因为逻辑上不对。

    3:多态

    没有继承就没有多态,多态是指父类指针指向子类对象。

    多态的好处:如果参数中使用的事父类类型,可以传入子类,父类的对象。

    相关文章

      网友评论

          本文标题:面向对象的三大特性

          本文链接:https://www.haomeiwen.com/subject/ilfzxctx.html