一、目标
1、熟练使用属性可见度
2、熟练区分属性可见度的特点
二、封装
含义:把相同特征和行为全部包括在类的内部
目的:防止外界去破坏对象内部结构和数据
三、属性可见度
三种常见的属性可见度:
1、公有属性
类的属性集合中,声明为公有性质的属性,该属性可以在当前类的文件或其他文件中进行使用
OC中关键字:@public
2、私有属性
类的属性集合中,声明为私有性质的属性,该属性仅可以在当前类的文件使用
OC中的关键字:@private
3、保护属性
类的属性集合中,声明为保护性质的属性,该属性仅可以在当前类和子类的文件使用
OC中的关键字:@protected
注意:OC中默认的实例变量的属性是保护性质的!!!
四、代码练习
1、创建Person类添加三种可见度的属性
2、创建Person类的子类Student
3、在Student类中添加测试方法-test
4、分别在main函数与test方法中使用Person类的三种属性
Person.h
#import <Foundation/Foundation.h>
@interface Person : NSObject
{
//公有性质的属性 姓名
@public
NSString *name;
//私有性质的属性 年龄
@private
NSInteger age;
//保护性质的属性 性别
@protected
NSString *gender;
}
@end
main.m
#import <Foundation/Foundation.h>
#import "Person.h"
int main(int argc, const char * argv[]) {
//创建Person类的实例对象
Person *person = [[Person alloc]init];
//为实例对象person的姓名属性进行赋值
person->name = @"ios";
/*
//为实例对象person的年龄属性进行赋值
person->age = 10;
//为实例对象person的性别属性进行赋值
person->gender = @"man";
*/
NSLog(@"实例对象的姓名是:%@",person->name);
/*
NSLog(@"实例对象的年龄是:%ld",person->age);
NSLog(@"实例对象的性别是:%@",person->gender);
*/
//command+b编译一下程序
//出现4个错误警告,提示age是私有属性,提示gender是保护属性
//说明在main函数中不能使用私有属性和保护属性,我们将私有属性和保护属性注释
//然后编译运行正确,说明main函数里面可以使用person的公有属性
return 0;
}
那么私有属性和保护属性的区别在哪呢?
下面新建Student继承Person
Student.jh#import "Person.h"
@interface Student : Person
//测试方法
- (void)test;
@end
Student.m
#import "Student.h"
@implementation Student
//测试方法
- (void)test{
self->name = @"Jack";
/*
self->age = 20;
*/
self->gender = @"man";
NSLog(@"实例对象的姓名是:%@",self->name);
/*
NSLog(@"实例对象的年龄是:%ld",self->age);
*/
NSLog(@"实例对象的性别是:%@",self->gender);
//command+b编译
//出现两个错误警告,提示age是私有属性,并没有警告保护属性gender
//我们将年龄赋值和打印注释掉
}
@end
mian.m
#import <Foundation/Foundation.h>
#import "Student.h"
int main(int argc, const char * argv[]) {
//创建学生类的实例对象
Student *student = [[Student alloc]init];
//对实例对象student发送测试消息
[student test];
//编译运行成功
/*
在子类的实现文件里,是可以直接使用父类的公有性质的属性的,而不能使用父类的私有性质的属性
在main.m以及其他文件,是不能够使用Person类的保护性质以及私有性质的属性,只能够使用Person类的公有性质属性。
*/
//那么怎么在main函数里面对类的保护和私有属性进行赋值的,这就用到第一节说到的设置器和访问器
return 0;
}