• OC第一个思想 类的封装


     一:对象方法和类方法

     对象方法:

        1)'-' 开头

        2)可以访问实例变量

        3)可以调用类方法

        4)可以调用自己和其他对象的方法(调用其他对象方法,要作为参数传递过来)

        5)由对象调用

      类方法:

        1)'+' 开头

        2)不可以访问实例变量

    在一个类方法中不能访问实例变量,因为实例变量还没有分配内存,初始化,也可以说还没有实例变量,原因是还没有对象

        3)类方法可以调用其他的类方法

        4)类方法不可以用对象调用

        5)类方法,可以调用对象方法(把对象作为方法参数传递过来

        6)类方法中不可以再调用当前方法(死循环) 

    例如Person类调用自己的类方法reach 

    + (void) reach;

    {     

    [Person reach]; 

    }

            [Person reach];      // 死循环

        注意:对象方法和类方法可以同名

    二:匿名类的使用

    1> 匿名类的第一种用法:

    Person *p = [Person new];

            //创建一个车的对象

            //显示的使用对象

            Car *car1 = [Car new];

            car1->_color=1;

            //人开车回家

            [p goHome:[Car new]];  //匿名的使用 

    Person对象方法goHome传入的参数对象为匿名对象[Car new];

    2>匿名类的第二种用法

    匿名类可以调用方法

             [[Car new] run];

    3> 匿名类的第二种用法

    访问类的成员变量 实际上达不到我想要的效果

            //[Car new]每执行一次,都会分配一块新的存储空间

    [Car new]->_color=2;

    三:封装

      类的封装:

        只能通过类的对象方法来访问类的成员变量的措施

      类的成员变量提供set和get方法

        set设置类的成员变量,set方法

        @interface Car:NSObject

         {

             //实例变量

             int _lunzi;

             int _color;

         }

         //定义set方法

         -(void)setLunzi:(int)lunzi;

         //定义get方法

         -(int)lunzi;

         //set color

         -(void)setColor:(int)color;

         -(int)color;

        @end

        @implementation Car

         //定义set方法

         -(void)setLunzi:(int)lunzi{

               _lunzi = lunzi;

         }

         //定义get方法

         -(int)lunzi{

               return _lunzi;

         }

         

         //set color

         -(void)setColor:(int)color{

               _color = color;

         }

         -(int)color{

               return _color;

         }

        @end

        书写规范:

         set方法:

        1)对象方法

        2)即然是设置成员变量值,set方法,可以没有返回值

        3)以set+去掉下划线的成员变量名,并且成员变量的首字母要大写

        4)既然要设定成员变量值,就得传过来要设定的值

                            传递过来的值得类型要和要设定的成员变量名一致

                            形参一般是去掉下划线的成员变量名

        get获取当前类的成员变量值,get方法 (可以实现懒加载:需要时在加载)

        get方法

        1)对象方法

        2)既然要获取成员变量的值,方法得有返回值

        3)返回值得类型必须要和要返回的成员变量的类型要一致

        4)方法名一般是去掉下划线的成员变量名

    封装的好处:1,不允许外部修改对象属性的值,只能通过对象的方法修改

      2,可以合理的对外部传入的值进行判断其合理性

    四:成员变量作用域

    @public 修饰成员变量在任何地方通过对象都可以访问

    @protected 系统默认修饰符   在本类和子类中可以访问

    @private 只有本类中才能访问

    @package 在同一个框架中可以访问 (其介于共有和私有之间)

    在.m文件中定义的变量或者方法都是私有的,外部文件或者子类都不能调用

    #import "Person.h"

    @implementation Person

    int a;

    //这个方法也是私有的

    -(void)getPassword{

        NSLog(@"获取到人得密码了");

    }

    -(void)test{

            //self是一个对象

        [self getPassword];

            a = 100;

        NSLog(@"_id = %d,a = %d",_id,a);

    }

    @end

    Person *p = [Person new];

     [p test]; p->a(属性值a和方法test就无法访问)

     注意:子类继承了父类,默认子类具有了父类的所有的方法和成员变量,但不一定子类中可以访问父类的成员变量和方法,情况一:
    父类的成员变量是私有的,二:父类的成员变量和方法定义在.m文件中,子类不能访问
  • 相关阅读:
    题目1441:人见人爱 A ^ B(二分求幂)
    题目1003:A+B(按逗号分隔的A+B)
    题目1002:Grading(题目背景基于高考打分的简单判断)
    题目1104:整除问题(还是求素数)
    题目1040:Prime Number(第k个素数)
    题目1440:Goldbach's Conjecture(哥达巴赫猜想)
    题目1438:最小公倍数(利用最大公倍数求解)
    题目1439:Least Common Multiple(求m个正数的最小公倍数lcm)
    题目1080:进制转换(任意进制直接转换方法)
    题目1083:特殊乘法(求模运算符的使用)
  • 原文地址:https://www.cnblogs.com/-boy/p/4067803.html
Copyright © 2020-2023  润新知