A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 崔石炫 中级黑马   /  2014-9-21 17:31  /  1721 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

封装作为面向对象的三大核心特性之一,具有重要意义。
封装将对象的数据与操作隔离开,通过向外部提供操作数据的接口来隐藏类的细节实现。
类方法的调用不依赖于对象,其调用者为类,比如:[Class ClassMethod]Class类执行ClassMethod行为,而[instance ClassMethod]这种用法是错误的,不能通过instance对象调用类方法ClassMethod;这就意味着类方法中无法访问成员变量,因为成员变量只有实例化对象之后才存在。类通常应用在不需要访问任何成员变量的场景,比如:工具类。
参考一下代码:
#import <Foundation/Foundation.h>
@interface Person : NSObject
{
//此处没有@public关键字,外界无法通过指针直接访问成员变量
int _age;
         double_weight;
}
- (void)setAge:(int)newAge;//set方法用于设置_age的值
- (int)age;// get方法用于获取_age的值
- (void)setWeight:(double)newWeight; //set方法用于设置_weight的值
- (double)weight; // get方法用于获取_weight的值
- (void)speak;//对象方法,人类的一种行为:说话
- (void)walk; //对象方法,人类的一种行为:走路
- (void)run; //对象方法,人类的一种行为:跑步
+ (void)introduction;//类方法(以加号+开头,其余语法与对象方法相同),人类的简介
@end
@implementation Person
- (void)setAge:(int)newAge
{
         self._age= newAge;/*self关键字,其本质是一个指针,指向该关键字所出现的方法的调用者。即,self出现在对象方法中时,self指向一个对象,出现在类方法中时,self指向类。self关键字可用于调用其自身代表的类的其他类方法,或自身代表的对象的其他方法和成员变量*/
}
- (int)age
{
         returnself._age;
}
- (void)setWeight:(double)newWeight
{
         self._weight= newWeight;
}
- (double)weight
{
         returnself._weight;
}
- (void)speak
{
         NSLog(@”年龄为:%d,体重为:%f的人说话”, _age, _weight);
}
- (void)walk
{
         NSLog(@”年龄为:%d,体重为:%f的人走路”, _age, _weight);
}
- (void)run
{
         NSLog(@”年龄为:%d,体重为:%f的人跑步”, _age, _weight);
}
+ (void)introduction;
{
         //NSLog(@”年龄为:%d,体重为:%f的人的简介”, _age,_weight);//错误的用法,类方法的调用者为类,无法访问对象的成员变量
         NSLog(@”人类是地球上有史以来最具智慧的生物,也是地球目前居于统治者地位的物种。”);
}
@end
int main()
{
         Person*p = [Person new];
         //p->_age= 24;//错误的用法,_age属性不是public的,外界无法用指针访问
         [psetAge:24];//必须通过set方法修改
         //NSLog(@”这个人的年龄为:%d岁。”, p->_age);//错误的用法,_age属性不是public的,外界无法用指针访问
         NSLog(@”这个人的年龄为:%d岁。”, [p age]);//必须通过get方法获取
         //[pintroduction];//错误的用法,introduction方法为类方法,无法通过对象调用
         [Personintroduction];//类方法的调用不依赖对象的存在,合法调用者为类本身,而不是对象
         return0;
}

4 个回复

正序浏览
基本没有太大的问题,在这里所有的self都报错了
  1. Person.h文件
  2. #import <Foundation/Foundation.h>

  3. @interface Person : NSObject
  4. {
  5.     //此处没有@public关键字,外界无法通过指针直接访问成员变量
  6.     int _age;
  7.     double _weight;
  8. }
  9. - (void)setAge:(int)age;//set方法用于设置_age的值
  10. - (int)age;// get方法用于获取_age的值
  11. - (void)setWeight:(double)weight; //set方法用于设置_weight的值
  12. - (double)weight; // get方法用于获取_weight的值
  13. - (void)speak;//对象方法,人类的一种行为:说话
  14. - (void)walk; //对象方法,人类的一种行为:走路
  15. - (void)run; //对象方法,人类的一种行为:跑步
  16. + (void)introduction;//类方法(以加号+开头,其余语法与对象方法相同),人类的简介


  17. @end
复制代码
  1. Person.m文件
  2. #import "Person.h"

  3. @implementation Person
  4. - (void)setAge:(int)age
  5. {
  6.     _age= age;/*self关键字,其本质是一个指针,指向该关键字所出现的方法的调用者。即,self出现在对象方法中时,self指向一个对象,出现在类方法中时,self指向类。self关键字可用于调用其自身代表的类的其他类方法,或自身代表的对象的其他方法和成员变量*/
  7. }
  8. - (int)age
  9. {
  10.     return _age;
  11. }
  12. - (void)setWeight:(double)weight
  13. {
  14.     _weight= weight;
  15. }
  16. - (double)weight
  17. {
  18.     return _weight;
  19. }
  20. - (void)speak
  21. {
  22.     NSLog(@"年龄为:%d,体重为:%f的人说话", _age, _weight);
  23. }
  24. - (void)walk
  25. {
  26.     NSLog(@"年龄为:%d,体重为:%f的人走路", _age, _weight);
  27. }
  28. - (void)run
  29. {
  30.     NSLog(@"年龄为:%d,体重为:%f的人跑步", _age, _weight);
  31. }
  32. + (void)introduction;
  33. {
  34.     //NSLog(@”年龄为:%d,体重为:%f的人的简介”, _age,_weight);//错误的用法,类方法的调用者为类,无法访问对象的成员变量
  35.    
  36.     NSLog(@"人类是地球上有史以来最具智慧的生物,也是地球目前居于统治者地位的物种。");
  37. }


  38. @end
复制代码
  1. main.m文件

  2. #import <Foundation/Foundation.h>
  3. #import "Person.h"

  4. int main()
  5. {
  6.     Person *p = [Person new];
  7.    
  8.     //p->_age= 24;//错误的用法,_age属性不是public的,外界无法用指针访问
  9.     [p setAge:24];//必须通过set方法修改
  10.    
  11.     [p setWeight:60];
  12.    
  13.     //NSLog(@”这个人的年龄为:%d岁。”, p->_age);//错误的用法,_age属性不是public的,外界无法用指针访问
  14.     NSLog(@"这个人的年龄为:%d岁。",[p age]);//必须通过get方法获取
  15.    
  16.     [p speak];
  17.    
  18.     [p walk];
  19.    
  20.     [p run];
  21.    
  22.     //[p introduction];//错误的用法,introduction方法为类方法,无法通过对象调用
  23.     [Person introduction];//类方法的调用不依赖对象的存在,合法调用者为类本身,而不是对象
  24.    
  25.     return 0;
  26. }
复制代码
回复 使用道具 举报
Kevinneo 发表于 2014-9-22 07:58
http://www.onlinedown.net/soft/560975.htm   可以在windows下运行Oc  需要就拿去     楼主的学习精神赞 ...

谢啦
我去试试看,看能不能吃得消,我的电脑不行了,入学成功就去买个mac
回复 使用道具 举报

http://www.onlinedown.net/soft/560975.htm   可以在windows下运行Oc  需要就拿去     楼主的学习精神赞一个
回复 使用道具 举报
没有mac,只能用Word记录,也无法验证代码的正确性,有错误希望大家指出来,共勉。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马