封装作为面向对象的三大核心特性之一,具有重要意义。 封装将对象的数据与操作隔离开,通过向外部提供操作数据的接口来隐藏类的细节实现。 类方法的调用不依赖于对象,其调用者为类,比如:[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; }
|