面向对象的三大特性

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:多态

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

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

你可能感兴趣的:(面向对象的三大特性)