zoukankan      html  css  js  c++  java
  • Objective-C基础学习笔记(三)-面向对象的三大特性之封装-set方法-get方法-类方法与对象方法

    面向对象的三大特性:封装(成员变量)、继承、多态;

    一、 封装

    1. 封装的理解:

        在开发过程中,考虑到安全性要求,我们通常不让外界直接修改我们类的成员变量,而让外界使用我们提供的方法来修改,这样类 的成员变量就           封装起来了。

    2. 封装的目的就是:保证数据的安全行,保证业务逻辑正常 运行。

    二、set 方法和get 方法

    @public的成员可以被随意赋值,为了封装成员变量OC中使用set方法和get方法来管理成员的访问。

     1. set方法

       1) 作用:提供一个方法给外界设置成员变量属性值,可在方法里面对一些不合理的赋值进行筛选和过滤。

       2) 命名规范

       1> 方法命名必须以set开头

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

       3> 返回值一定是void

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

       5>行参名称不能跟成员变量名一样,苹果官方规定成员变量的命名以 _开头

      3) set方法好处:

         1> 不让数据暴露在外,保证了数据的安全性

       2> 对设置的数据进行过滤

    2. get方法

        1) get方法的作用:为调用者返回对象内部的成员变量
        2) 命名规范:
         (1)一定有返回值,返回值的类型和成员变量的类型一致
         (2)方法名和成员变量名一样
         (3)不需要接收任何参数

    3.成员变量的命名规范
           ➢成员变量都以下划线 _ 开头
           ➢可以跟get方法的名称区分开
           ➢可以跟其他局部变量区分开,一看到下划线开头的变量,肯定是成员变量

    4. 不一定set和get方法都会提供,如果内部的成员变量只允许外界读取,但是不允许修改的情况,则通常只提供get方法而不提供set 方法。

    5. set方法和get方法使用示例:

     1 #import <Foundation/Foundation.h>
     2 
     3 @interface Student : NSObject
     4 {
     5     //@public
     6     //成员变量保证安全性不要用public
     7     int _age;  // 年龄
     8     int _num; // 学号
     9 }
    10 
    11 /* set方法声明 */
    12 - (void)setAge:(int)age;
    13 
    14 /* get方法声明 */
    15 - (int)age;
    16 @end
    17 
    18 @implementation Student
    19 
    20 /* set 方法实现 */
    21 - (void)setAge:(int)age
    22 {
    23     // 对参数进行过滤
    24     if (age <= 0)
    25     {
    26         age = 1;
    27     }
    28     _age = age;
    29 
    30 }
    31 /* get 方法实现 */
    32 - (int)age
    33 {
    34     // 返回成员变量的值
    35     return _age;
    36 }
    37 @end
    38 
    39 int main()
    40 {
    41     Student *stu = [Student new];
    42     [stu setAge:-12];
    43     NSLog(@"学生的年龄是%d岁",[stu age]);
    44     return 0;
    45 }

    运行结果:

    2015-03-16 22:44:39.247 a.out[1798:164370] 学生的年龄是1岁

    三、方法与函数的区别

      1) OC方法只能声明在@interface和@end之间,只能实现在@implementation和@end之间。也就是说OC方法不能独立于类存在

      2) C函数不属于类,跟类没有联系,C函数只归定义函数的文件所有

      3) C函数不能访问OC对象的成员

    四、类方法与对象方法

      1.  方法名注意

         >  冒号也是方法名的一部分

         >  同一个类中不允许两个对象方法同名

      2.  方法的调用

         OC中执行一些行为就加[]具体如下:

    [stu setAge:-12]; //调用 stu 对象的setAage方法并传入了参数-12 ,实际意义是向stu 这个对象发送了一个消息

    3. OC中的两种方法:类方法和对象方法

    什么是类方法:直接可以用类名来执行的方法(类本身会在内存中占据存储空间,里面有类对象方法的列表

    什么是对象方法:直接可以用对象来执行的方法(

    1) 对象方法
    以减号-开头
    只能由对象调用,没有对象,这个方法根本不可能被执行
    对象方法能访问实例变量(成员变量)

    2) 类方法
    以加号+开头
    只能用类名调用,对象不能调用,不用创建对象
    类方法中不能访问实例变量(成员变量)
    使用场合:
    当方法内部不需要使用到成员变量时,就可以改为类方法,一般没有成员的变量的类(工具类:没有任何成员变量,里面的方法都是类方法,如计算器)

    3)类方法和对象方法可以同名,对象方法中能够调用类方法,类方法中也可以调用对象方法 

    4)  类方法使用的好处:

          不依赖对象,执行效率高,能用类方法就尽量用类方法

    5)类方法使用陷阱--小心死循环  

    1 +(void)test
    2 {
    3      [person test];
    4 }

    4. 类方法与对象方法示例

    #import <Foundation/Foundation.h>
    
    @interface Person : NSObject
    
    //类方法都是以+开头
    + (void)printClassName;
    //对象方法都是以-开头
    - (void)test;
    @end
    
    @implementation Person
    
    /* 类方法实现 */
    + (void)printClassName
    {
        NSLog(@"Person");
    }
    /* 对象方法实现 */
    - (void)test
    {
        NSLog(@"This is test function");
    }
    @end
    
    int main()
    {
        //运行时类加载到内存,里面有方法列表,直接去 类列表地址中找加号开头的方法
        //不用创建对象
        [Person printClassName];
    
        Person *p = [Person new];
        // 对象方法调用
        [p test];
    
        return 0;
    }


  • 相关阅读:
    【POJ 3162】 Walking Race (树形DP-求树上最长路径问题,+单调队列)
    【POJ 2152】 Fire (树形DP)
    【POJ 1741】 Tree (树的点分治)
    【POJ 2486】 Apple Tree (树形DP)
    【HDU 3810】 Magina (01背包,优先队列优化,并查集)
    【SGU 390】Tickets (数位DP)
    【SPOJ 2319】 BIGSEQ
    【SPOJ 1182】 SORTBIT
    【HDU 5456】 Matches Puzzle Game (数位DP)
    【HDU 3652】 B-number (数位DP)
  • 原文地址:https://www.cnblogs.com/jianghg/p/4425663.html
Copyright © 2011-2022 走看看