亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

第二講、實例變量可見度、方法

發布時間:2020-07-22 21:29:51 來源:網絡 閱讀:478 作者:遙星夢 欄目:開發技術

一、實例變量可見度

    可見度         特點

    public          實例變量可以在類的外部和內部操作

    protected    實例變量只能在該類和其子類內操作     默認

    private        實例變量只能在該類內訪問

    內部:相應類的@implementation@end之間


     @interface Person : NSObject

     {

         @public

         NSString*_name;

         @protected

         NSString*_gender;

         int_age; //年齡

         @private

         NSString*_age;

      }

    mian.m文件中使用

    Person * p = [[Person alloc] init];
    p->_name = @"zhangyixing";
    // p->_gender = @'m';  // 警告
    // p->_age = 18;       // 警告


   為什么不使用@public   暴露細節 不符合封裝

      在其他文件訪問@protected修飾的實例變量-----方法   

    提示:添加兩個方法。

    賦值:通過方法傳入參數,在類的內部實現實例變量賦值。

    取值:通過方法獲取實例變量的值。


二、方法--方法類型、返回值類型、方法名、參數列表

       OC中的方法------類方法、實例方法

    同一個中,所有的類方法中不能出現重名 所有的實例方法中不能出現重名

    1、  類方法:只能類使用   [類名 類方法名]   

      在類方法中不能使用實例變量 調用類方法時沒有創建對象

    聲明-----Person.h

    + (void)sayHi;

    實現-----Person.m

    + (void)sayHi
    {
       NSLog(@"hi");
    }

    2、實例方法:只能對象使用   [對象 實例方法名]

       聲明-----Person.h

    - (void)sayHello;  

    實現-----Person.m  

    - (void)sayHello
    {
       NSLog(@"hello");
    } 

   3、聲明方法   (返回值類型)沒有參數只寫方法名

    (1)無返回值、無參數
     - (void)sleep;

     實現

     - (void)sleep
    {
        NSLog(@"sleep");
    }

     使用

     [p sleep];


    (2)無返回值、有參數

     語法--- :(參數類型)參數名  

     參數以:開頭   ":"標識參數,不能省略。有冒號必須有參數

     ///// 一個參數      

    - (void)eat:(NSString *)food; 

    實現

    - (void)eat:(NSString *)food
    {
       NSLog(@"%@",food);
    
    }

    使用

    [p eat:@"beef"];


    ///// 兩個參數

    - (void)setName:(NSString *)name age:(NSInteger)age;  // 賦值

    實現

    - (void)setName:(NSString *)name age:(NSInteger)age
    {
       _name = name;
       _age = age;    

       // name和age是方法的形參,接收從外部傳入的值
    }

    使用

    [p setName:@"zhangyixing" age:18];

   (3) 有返回值、無參數
    - (NSString *)getName; // 取值

    實現

    - (NSString *)getName
    {
        return _name;
    }

    使用

    NSLog(@"name=%@",[p getName]);

    // 方法名使用駝峰命名法---方法名: setName:age: 

       首字母小寫;第一個參數修飾符首字母大寫;

       第二個首字母小寫;都使用駝峰命名法

   

   4、方法使用----[person sayHi];

      在OC中沒有”student調用sayHi“這種表述。

      在OC中使用消息發送機制:[receiver  message]。

      正確表述:給student對象發送sayHi消息。

       1)student接收到消息,即方法sayHi;

       2)student找到sayHi方法,并執行。


三、setter、getter

    1、簡述

    在OC里,為實例變量賦值的方法稱作setter(設置器)。

    讀取實例變量值的方法稱作getter(訪問器)。

    我們之前寫的那些賦值取值的方法都可以稱作setter和getter。

     2、實例

     (1)設置_name實例變量的值
      // setter方法是實例方法,沒有返回值,只有一個參數
      // 方法名 set + 實例變量名(忽略_,使用駝峰命名法)
      // 參數  跟操作的實例變量有關 類型跟操作的實例變量一致  實例變量名(忽略_)
      - (void)setName:(NSString *)name;
      實現

      - (void)setName:(NSString *)name
     {
        _name = name;

       // name是方法的形參,接收從外部傳入的值  _name實例變量
     }

     (2)訪問實例變量
      // getter是實例方法 沒有參數 返回值類型與操作的實例變量保持一致
      // 方法名  實例變量名(忽略_)  切記:不要以get開頭
      - (NSString *)name;

     實現

      - (NSString *)name
     {
        return _name;
     }

     (3)使用

      // 使用setter方法給Person對象的實例變量_name賦值
      [p setName:@"zhang"];
      // 使用getter方法讀取實例變量的值
       NSLog(@"name = %@", [p name]);


       3、與實例變量的關系

    無論setter還是getter內部操作的是實例變量

    每個實例變量都需要一對setter和getter方法

        4、main.m文件中使用

     // 使用setter方法給Person對象的實例變量_name 和_age賦值
     [p setName:@"zhang"];
     [p setAge:23];
     // 使用getter方法讀取實例變量的值
     NSLog(@"name = %@, age = %ld", [p name], [p age]);


四、自定義初始化方法

    -(id)init這個初始化方法只能給實例變量設置默認值,不靈活

    - (id)init
    {
        return self;
    }

    -(id)initWithName:自定義初始化法,根據需求定義初始化方法

    // 自定義初始化方法 初始化對象時給_name和_age賦值
    - (id)initWithname:(NSString *)name age:(NSInteger)age;

    實現

    - (id)initWithname:(NSString *)name age:(NSInteger)age
    {
       // 對象初始化時可以傳入姓名和年齡   將傳入的值賦值給實例變量
       _name = name;
       _age = age;
       return self;
     }


        main.m文件中使用

     Person * p3 = [[Person alloc] initWithname:@"zhangyixing" age:18];
     Person * p4 = [[Person alloc] initWithname:@"liyifeng" age:20];
     NSLog(@"name=%@",[p3 name]);
     [p4 setName:@"liminhao"];
     NSLog(@"name=%@",[p4 name]);


五、導入文件

 1、#import導入頭件,即:導入頭件中的內容到當前類。

    #import “”導入自定義類,自己創建的文件  從當前工程目錄開始查詢

    #import  <> 導入類庫中的頭文件,自己創建的文件  從當前工程目錄開始查詢

    功能類似C語言中的#include,但是可以避免頭文件被重復導入。

    容易出現循環導入頭文件問題。

 2、#include 和 #import的區別

    (1)include不能重復導入同一個文件
    (2)import可以重復導入同一個文件

 3、@class

    #import可能會造成循環導入頭文件問題,需要使用@class解決

    @class的作用,告知編譯器系統class后面的標識符可以作為一個類名使用;并沒有導入這個類的內容

    使用@class可以解決循環導入頭文件的問題。

    如果需要在類的接口部分使用其他類型:

    1)在.h文件中,使用@class聲明需要使用的類型;

    2)在.m文件中,使用#import導入需要使用的類型


 實例

    創建Man、Woman、Child三個類并完成聲明與實現部分

    新創建Family類

      Family.h文件 

    #import <Foundation/Foundation.h>

    // 使用@class“導入”文件

    @class Man;
    @class Woman;
    @class Child;

    @interface Family : NSObject

    // 定義實例變量

    {
        Man * _father;
        Woman * _mother;
        Child * _kid;
    }
    // 初始化方法設置father和mother
    - (id)initWithFather:(Man *)father mother:(Woman *)mother;
    // 聲明setter、getter方法
    - (void)setFather:(Man *)father;
    - (Man *)father;
    - (void)setMother:(Woman *)mother;
    - (Woman *)mother;
    - (void)setKid:(Child *)kid;
    - (Child *)kid;
    // 聲明一般方法
    - (void)introduce;


       Family.m文件

    #import "Family.h"
    導入文件
    #import "Man.h"
    #import "Woman.h"
    #import "Child.h"
    @implementation Family
    // 初始化方法設置father和mother
    - (id)initWithFather:(Man *)father mother:(Woman *)mother
    {
        _father = father;
        _mother = mother;
        return self;
    }
    // 實現setter、getter方法
    - (void)setFather:(Man *)father
    {
        _father = father;
    }
    - (Man *)father
    {
        return _father;
    }
    - (void)setMother:(Woman *)mother
    {
        _mother = mother;
    }    
    - (Woman *)mother
    {
        return _mother;
    }
    - (void)setKid:(Child *)kid
    {
        _kid = kid;
    }
    - (Child *)kid
    {
        return _kid;
    }
    // 實現一般方法
    - (void)introduce
    {
        NSLog(@"father:%@,mother:%ld,kid:%@", [_father name], [_mother age], [_kid gender]);
    }


      main.m文件

   #import <Foundation/Foundation.h>

    // 導入文件

    #import "Man.h"
    #import "Woman.h"
    #import "Child.h"
    #import "Family.h"


    Man * m = [[Man alloc] initWithName:@"zhangjiashuai"];
    Woman * w = [[Woman alloc] initWithName:@"zhangjiamei" age:18];

    Family * f = [[Family alloc] initWithFather:m mother:w];

    Child * c = [[Child alloc] initWithName:@"zhangyi" gender:@"m"]; 
    [f setKid:c];
    [f introduce];


六、總結

   1、實例變量有3種常見的可見度:@public、@protected、@private。

      @public違背了封裝特性,面向對象開發中很少使用;

      @protected默認可見度,自己和子類中能使用—>訪問實例變量;

      @private自己類中能使用—>訪問實例變量。

   2、方法是OC的核心,采用消息機制:[receiver message]。

      “-”message由對象來調用;

      “+”message由類來調用。









向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

泰兴市| 磐安县| 集安市| 时尚| 包头市| 九江县| 安化县| 隆昌县| 凤阳县| 灵宝市| 康保县| 石楼县| 金堂县| 太谷县| 卓尼县| 滕州市| 镶黄旗| 铜川市| 卓资县| 江油市| 吕梁市| 舞钢市| 通化市| 房山区| 柳江县| 甘德县| 凭祥市| 乌鲁木齐市| 安乡县| 禄丰县| 永年县| 嘉义市| 尼玛县| 霍城县| 额尔古纳市| 玉山县| 西充县| 岳阳县| 库尔勒市| 灌南县| 玛曲县|