黑马程序员技术交流社区

标题: 权限修饰符_总结 [打印本页]

作者: huh    时间: 2015-12-8 22:59
标题: 权限修饰符_总结

是什么?

   公共的    框架的   受保护的   私有的

   public >package>protected>private

有什么用?

    限定"直接访问属性"的范围!

怎么用?

    直接在属性上面,写入权限标识符!

用的时候注意什么?

    只能修饰属性,不能修饰方法!

  1. Student.h
  2. #import <Foundation/Foundation.h>
  3. #import "Person.h"
  4. @interface Student : Person
  5. -(void)testStu;
  6. @end
  7. Student.m
  8. #import "Student.h"
  9. @implementation Student
  10. -(void)testFan{
  11.     NSLog(@"只有实现,没有声明的方法");
  12. }
  13. -(void)testStu{
  14.     //@protected修饰的属性,可以在子类直接访问属性
  15.     _cda =10;
  16.     _name =@"huh2";
  17.    
  18.     //@private 修饰的属性,不可以在子类和外部直接访问!
  19.     //_high = 17;
  20.     NSLog(@"cad=%d name =%@",_cda,_name);
  21.    
  22.     //一个方法可以只有实现,没有声明!但是,它只能在本类使用!不能在子类和外部直接使用
  23.     //self.testPer;
  24.     [self testFan];
  25. }
  26. @end
  27. Person.h
  28. #import <Foundation/Foundation.h>
  29. @interface Person : NSObject{
  30.         //如果上面没有别的属性,默认是@protected.只能在本类和子类直接访问,外部定义get和set
  31.     int _cda;
  32.    
  33.     @public  //表示在任何地方都能通过对象直接访问.对象名->属性名.
  34.     int _age;
  35.    
  36.     @protected //只能在本类和子类中直接访问.在外部访问需要定义setget方法去访问.
  37.     NSString *_name;
  38.     @private  //只能在本类中直接访问.子类与外部都不允许.只能通过setget方法访问.
  39.     int _high;
  40.     @package //表示能在框架中访问.权限是介于public与protected之间的.
  41.     int weight;
  42.    
  43.     //留空什么都不写.如果上面有属性,则跟随上一个属性的权限.
  44.     int _adc;
  45. }
  46. -(void)setName:(NSString *)name;
  47. -(NSString *)name;
  48. @property int high;
  49. -(void)testPer;
  50. @end
  51. Person.m
  52. #import "Person.h"
  53. @implementation Person
  54. #pragma mark - name的set和get方法
  55. -(void)setName:(NSString *)name{
  56.     _name = name;
  57. }
  58. -(NSString *)name{
  59.     return _name;
  60. }
  61. #pragma mark - 其他方法
  62. -(void)testPer{
  63.     //@protected 能在本类和子类直接访问属性
  64.     _cda = 322;
  65.     NSLog(@"_cda=%d",_cda);
  66. //    NSLog(@"_cda=.....");
  67. }
  68. @end
  69. PigTest.h
  70. #import <Foundation/Foundation.h>
  71. @interface PigTest : NSObject
  72. -(void)pgTest;
  73. @end
  74. PigTest.m
  75. #import "PigTest.h"
  76. #import "Person.h"
  77. @implementation PigTest
  78. -(void)pgTest{
  79.     //在外部不能直接访问@protected修饰的属性_age
  80.     Person *pson = [Person new];
  81.     //pson.age; 错误 [pson age];错误
  82.     //在外部访问@protected修饰的属性,只能访问set和get方法pson.name=@"huh";
  83.     [pson setName:@"huh2"];
  84.    
  85.     //@public 修饰的属性,在任意地方都可以通过对象名->属性,来直接访问属性
  86.     pson -> _age = 110;
  87.     NSLog(@"姓名:%@",[pson name]);
  88.    
  89.     }
  90. @end
  91. main.m
  92. /*
  93. (成员变量)的作用域.
  94. 是由权限修饰符控制的
  95. 公共的    框架的   受保护的   私有的
  96. public >package>protected>private

  97. @public  //表示在任何地方都能通过对象直接访问.对象名->属性名.
  98. int _age;

  99. @protected //只能在本类和子类中直接访问.在外部访问需要定义setget方法去访问.
  100. NSString *_name;

  101. @private  //只能在本类中直接访问.子类与外部都不允许.只能通过setget方法访问.
  102. int _high;

  103. @package //表示能在框架中访问.权限是介于public与protected之间的.
  104. int weight;


  105. //留空什么都不写.1. 如果上面有属性,则跟随上一个属性的权限. 2.如果上面没有别的属性,默认是@protected.
  106. int _adc;


  107. 注意的问题:
  108. 一个类只有实现是可以的.能够创建对象并使用.但只有声名是不行的.
  109. 且也能定义属性.但属性默认的权限修饰符是private.
  110. 但,不推荐这么做.一个类定义的时候应该声名,实现都要定义.

  111. 一个方法可以只有实现,没有声明!但是,它只能在本类使用!不能在子类和外部直接使用
  112. 那方法如何在main里面体现出来呢?通过有声明的方法,来进行调用
  113. -(void)testFan{
  114. NSLog(@"只有实现,没有声明的方法");
  115. }
  116. //有声明的方法
  117. -(void)testStu{
  118.    [self testFan];
  119. }
  120. */
  121. #import <Foundation/Foundation.h>
  122. #import "Student.h"
  123. #import "PigTest.h"
  124. int main(int argc, const char * argv[]) {
  125.     Student *stu = [Student new];
  126.     [stu testStu];
  127.     //stu.testStu; //点语法
  128.    
  129.     //@protected修饰的属性,能在本类直接访问属性
  130.     Person *per = [Person new];
  131.     [per testPer];
  132.     //per.testPer;
  133.    
  134.     //@protected修饰的属性,能在子类直接访问属性
  135.     Person *pe = [Student new];
  136.     ((Student *)pe).testStu;
  137.    
  138.     //@protected修饰的属性,在外部可以通过get和set方法进行访问
  139.     PigTest *pt = [PigTest new];
  140.     pt.pgTest;
  141.    
  142.     //@private 修饰的属性,不能在子类和外部直接访问
  143.     //@private 修饰的属性,可以通过get和set方法进行方法
  144.     pe.high =10;
  145.     NSLog(@"高度%d",pe.high);
  146.     return 0;
  147. }
复制代码




作者: 哭得想笑    时间: 2015-12-8 23:04
看样子是下过功夫的啊,理解 很深
作者: konglong    时间: 2015-12-8 23:23
真的好强大




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2