第二讲、实例变量可见度、方法

一、实例变量可见度

可见度         特点

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由类来调用。

时间: 2024-12-28 22:47:16

第二讲、实例变量可见度、方法的相关文章

第二讲实例变量可见度,set/get方法,自定义初始化(代码) 及description的使用

一.实例变量可见度,setter和getter方法,自定义初始化的综合使用实例 Person.h文件 1 #import <Foundation/Foundation.h> 2 3 @interface Person : NSObject 4 { 5 @private 6 NSString *_name; 7 int _age; 8 @protected 9 NSString *_sex; 10 NSString *_hobby; 11 @public 12 NSString *_addres

Oc(实例变量可见度与方法)(InstanceVariableAndMethod)

main函数 // //  main.m //  2-3 LessionInstanceVariableAndMethod // //  Created by lanouhn on 15/2/3. //  Copyright (c) 2015年 lanouhn. All rights reserved. // #import <Foundation/Foundation.h> #import "Boy.h" #import "MobilePhone.h"

OC实例变量初始化方法

OC实例变量初始化方法1. 使用实例setter方法 默认初始化方法 + setName:xxx setAge:xxx2. 使用实例功能类方法,默认初始化方法 + setName:xxx age:xxx3.使用实例初始化方法 initWith开头的方法4.使用构造器 类名+With…以Person  Student两个类为例1. 使用实例 setter方法这是最麻烦的方法 @interface Person : NSObject { NSString *_name; NSString *_sex

OC总结第二讲:实例变量可见度和方法

实例变量有3种常用的可见度:@public  @protected  @private public(公有的) 实例变量可以在类的外部和内部操作 protected(受保护的,默认的) 实例变量只能在该类和其子类内操作 private(私有的) 实例对象只能在该类内访问 所谓的内部,指的是相应类的@implementation和@end之间 方法: 1.类方法:只能类使用 例如: +(id)alloc 注意:类方法中不能使用实例变量 2.实例方法: 只能对象使用, - (void)satHi 程

实例变量可见度、方法、setter、getter

oc中的消息机制:如果为类方法,消息接收者为类名 如果为实例方法,消息接收者为对象名 消息带参数给参数,不带就不给 消息有返回值,定义相同类型的变量接收,没有就不需要定义变量 //各实例变量的课件度 NSInteger _height; @public NSString *_name;//为什么不默认用@public 修饰实例变量,破坏了封装性,不安全: @protected NSString *_gender; @private NSInteger _age; //其所占字节数根据操作系统位数

OC中实例变量可见度、setter、getter方法和自定义初始化方法

在对类和对象有一定了解之后,我们进一步探讨实例变量的可见度等相关知识 实例变量的可见度分为三种情况:public(共有),protected(受保护的,默认),private(私有的),具体的不同和特点如下: 具体的使用示例如下: 编程时默认的可见度是@protectde,为什么不使用@public呢? 因为OC是面向对象编程,使用@public关键字,暴漏了类内部的细节,从而不符合面向对象语言的三大特性之一——封装 实例变量经过@protectde修饰之后,我们就不能在该类和其子类外操作,例如

Obj-c2[实例变量可见度和方法]

////setter方法  设置器,专门给一个实例变量赋值的方法//- (void)setName:(NSString *)name;//- (void)setAge:(NSInteger)age;//- (void)setSex:(NSString *)sex;//- (void)setWeight:(CGFloat)weight;//- (void)setHeight:(CGFloat)height;//////getter方法 访问器,用来得到一个实例变量内容的方法//- (NSStrin

实例变量可见度修饰符

1.public;2.protected;3.private;4.package //1.public (公共的), 作用域是不受限制的被public修饰的实例变量,不仅可以在所属的类和子类中直接访问,而且还可以被其他类定义的方法直接访问 //2.protected (受保护的),如果实例变量不写修饰符.默认为protected,作用域:所属类和子类定义的方法中可以访问 //3.private(私有的),作用域:所属的类的方法调用,不能被子类定义的方法调用 //4.package(包,框架),了

面向对象(类,实例变量,方法定义,方法重载,构造方法,this,string类)

面向对象 类是由属性和方法组成 类是所有创建对象的模板 实例变量有默认值 实例变量至少在本类范围中有效 实例变量与局部变量冲突时,局部变量优先 类中方法定义类似于函数定义 修饰符 返回值类型 方法名(参数1,参数2) 异常{ 方法体 } 方法重载 参数个数不同 参数类型不同 参数类型相同但是顺序不同 传入参数的不同自动选取相应方法:典型例子system.out.println(整形,字符串等); 构造方法 1.构造方法无返回值 2.不定义的情况下,有默认的空构造方法 3.在对象构造时,被自动调用