是什么? 公共的 框架的 受保护的 私有的 public >package>protected>private 有什么用? 限定"直接访问属性"的范围! 怎么用? 直接在属性上面,写入权限标识符! 用的时候注意什么? 只能修饰属性,不能修饰方法! - Student.h
- #import <Foundation/Foundation.h>
- #import "Person.h"
- @interface Student : Person
- -(void)testStu;
- @end
- Student.m
- #import "Student.h"
- @implementation Student
- -(void)testFan{
- NSLog(@"只有实现,没有声明的方法");
- }
- -(void)testStu{
- //@protected修饰的属性,可以在子类直接访问属性
- _cda =10;
- _name =@"huh2";
-
- //@private 修饰的属性,不可以在子类和外部直接访问!
- //_high = 17;
- NSLog(@"cad=%d name =%@",_cda,_name);
-
- //一个方法可以只有实现,没有声明!但是,它只能在本类使用!不能在子类和外部直接使用
- //self.testPer;
- [self testFan];
- }
- @end
- Person.h
- #import <Foundation/Foundation.h>
- @interface Person : NSObject{
- //如果上面没有别的属性,默认是@protected.只能在本类和子类直接访问,外部定义get和set
- int _cda;
-
- @public //表示在任何地方都能通过对象直接访问.对象名->属性名.
- int _age;
-
- @protected //只能在本类和子类中直接访问.在外部访问需要定义setget方法去访问.
- NSString *_name;
- @private //只能在本类中直接访问.子类与外部都不允许.只能通过setget方法访问.
- int _high;
- @package //表示能在框架中访问.权限是介于public与protected之间的.
- int weight;
-
- //留空什么都不写.如果上面有属性,则跟随上一个属性的权限.
- int _adc;
- }
- -(void)setName:(NSString *)name;
- -(NSString *)name;
- @property int high;
- -(void)testPer;
- @end
- Person.m
- #import "Person.h"
- @implementation Person
- #pragma mark - name的set和get方法
- -(void)setName:(NSString *)name{
- _name = name;
- }
- -(NSString *)name{
- return _name;
- }
- #pragma mark - 其他方法
- -(void)testPer{
- //@protected 能在本类和子类直接访问属性
- _cda = 322;
- NSLog(@"_cda=%d",_cda);
- // NSLog(@"_cda=.....");
- }
- @end
- PigTest.h
- #import <Foundation/Foundation.h>
- @interface PigTest : NSObject
- -(void)pgTest;
- @end
- PigTest.m
- #import "PigTest.h"
- #import "Person.h"
- @implementation PigTest
- -(void)pgTest{
- //在外部不能直接访问@protected修饰的属性_age
- Person *pson = [Person new];
- //pson.age; 错误 [pson age];错误
- //在外部访问@protected修饰的属性,只能访问set和get方法pson.name=@"huh";
- [pson setName:@"huh2"];
-
- //@public 修饰的属性,在任意地方都可以通过对象名->属性,来直接访问属性
- pson -> _age = 110;
- NSLog(@"姓名:%@",[pson name]);
-
- }
- @end
- main.m
- /*
- (成员变量)的作用域.
- 是由权限修饰符控制的
- 公共的 框架的 受保护的 私有的
- public >package>protected>private
-
- @public //表示在任何地方都能通过对象直接访问.对象名->属性名.
- int _age;
-
- @protected //只能在本类和子类中直接访问.在外部访问需要定义setget方法去访问.
- NSString *_name;
-
- @private //只能在本类中直接访问.子类与外部都不允许.只能通过setget方法访问.
- int _high;
-
- @package //表示能在框架中访问.权限是介于public与protected之间的.
- int weight;
-
-
- //留空什么都不写.1. 如果上面有属性,则跟随上一个属性的权限. 2.如果上面没有别的属性,默认是@protected.
- int _adc;
-
-
- 注意的问题:
- 一个类只有实现是可以的.能够创建对象并使用.但只有声名是不行的.
- 且也能定义属性.但属性默认的权限修饰符是private.
- 但,不推荐这么做.一个类定义的时候应该声名,实现都要定义.
-
- 一个方法可以只有实现,没有声明!但是,它只能在本类使用!不能在子类和外部直接使用
- 那方法如何在main里面体现出来呢?通过有声明的方法,来进行调用
- -(void)testFan{
- NSLog(@"只有实现,没有声明的方法");
- }
- //有声明的方法
- -(void)testStu{
- [self testFan];
- }
- */
- #import <Foundation/Foundation.h>
- #import "Student.h"
- #import "PigTest.h"
- int main(int argc, const char * argv[]) {
- Student *stu = [Student new];
- [stu testStu];
- //stu.testStu; //点语法
-
- //@protected修饰的属性,能在本类直接访问属性
- Person *per = [Person new];
- [per testPer];
- //per.testPer;
-
- //@protected修饰的属性,能在子类直接访问属性
- Person *pe = [Student new];
- ((Student *)pe).testStu;
-
- //@protected修饰的属性,在外部可以通过get和set方法进行访问
- PigTest *pt = [PigTest new];
- pt.pgTest;
-
- //@private 修饰的属性,不能在子类和外部直接访问
- //@private 修饰的属性,可以通过get和set方法进行方法
- pe.high =10;
- NSLog(@"高度%d",pe.high);
- return 0;
- }
复制代码
|