黑马程序员——从类说开去,说开去,开去,去......
2015-05-30 17:17
543 查看
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
在对面向对象编程有了一定了解之后,已经可以自己写写简单的程序了。在自己的程序里制造世界,这种感觉就好像天下在手。
不过万事开头难。在“创造万物”之前先来造两个人吧 !
由于众所周知的原因,这两个人恐怕叫做亚当和夏娃。那么:
好了,现在我们有了2个人,一个人是亚当,一个夏娃。
他们做点什么好呢?
历史的车轮总是不停的旋转,果不其然吃了苹果。
声明一下:
再实现一下:
木已成舟。亚当和夏娃都吃掉了苹果有了人的智慧。那么是谁引诱的他们呢?
没错,是撒旦(satan)。让撒旦也登场吧。
不能做无名蛇。
之后的故事我们也知道。亚当和夏娃“变聪明”之后,生下了两个孩子。名字分别是该隐(Gain)和亚伯 (Abel)。
在类里也有这种表示这种传承关系的代码,叫做“继承”。
由于继承了Person类,所以,CHild类一出现就具有了_name属性以及 setName 和 eatApple的方法,并不需要再声明或者实现。
这就是继承的力量啊!
但是从圣经里知道,该隐和亚伯在出生后,并不安生,最后该隐杀掉了自己的亲兄弟亚伯。
摊手。果然子类也会有自己独特的“方法”啊。
子类Child,也就是c1,c2,在声明了自己的函数之后就可以直接调用了。
说完了西方的神话故事。再回到小时候我们看过的动画片《葫芦娃》!
这里可以使用分类(category)概念。
先创建一个葫芦兄弟的类吧 。
那么分类是怎么使用的呢?
回忆一下,是不是每一个葫芦娃都有自己的本领呢?这就是分类的概念了。
有了通俗的例子之后,理解分类应该容易很多了。
严格的说,分类的作用就是不改变类原有代码的基础上,为类添加一些方法,也只能添加方法,并不能添加成员变量。作为同一个类,分类可以访问原类声明中的成员变量。
分类的优先级很高,如果在分类中重新实现了一个原类的方法,那么使用的时候会优先调用分类。
说起方法调用的优先级:“分类 > 类 > 父类”。也就是说,在分类能找到的方法,编译器不会再去其他地方寻找。若寻找不到,则去原类或者父类甚至父类的父类中去寻找。
搜索
复制
在对面向对象编程有了一定了解之后,已经可以自己写写简单的程序了。在自己的程序里制造世界,这种感觉就好像天下在手。
不过万事开头难。在“创造万物”之前先来造两个人吧 !
@interface Person : NSObject { NSString *_name; } @end @implementation Person @end
int main (int argc, const char *argv[]) { Person *p1 = [Person new]; person *p2 = [Person new]; return 0; }
由于众所周知的原因,这两个人恐怕叫做亚当和夏娃。那么:
Person *p1 = [Person new]; person *p2 = [Person new]; //做个setName方法给他们命名: - (void)setName:(NSString *)name { _name = name; }
[p1 setName:@"Adam"]; [p2 setName:@"Eve"];
好了,现在我们有了2个人,一个人是亚当,一个夏娃。
他们做点什么好呢?
历史的车轮总是不停的旋转,果不其然吃了苹果。
声明一下:
- (void)eatApple;
再实现一下:
- (void)eatApple { NSLog(@"他们竟然吃了苹果!!!!"); }
木已成舟。亚当和夏娃都吃掉了苹果有了人的智慧。那么是谁引诱的他们呢?
没错,是撒旦(satan)。让撒旦也登场吧。
<pre name="code" class="objc">@interface Snake : NSObject { NSString *_name; } - (void)setName:(NSString *)name; @end @implementation Snake - (void)setName:(NSString *)name { _name = name; } @end
不能做无名蛇。
Snake *s = [Snake new]; [Snake setName:@"Satan"];
之后的故事我们也知道。亚当和夏娃“变聪明”之后,生下了两个孩子。名字分别是该隐(Gain)和亚伯 (Abel)。
在类里也有这种表示这种传承关系的代码,叫做“继承”。
@interface Child : Person //冒号表示Child 继承自 Person @end @implementation Child @end
由于继承了Person类,所以,CHild类一出现就具有了_name属性以及 setName 和 eatApple的方法,并不需要再声明或者实现。
这就是继承的力量啊!
Child *c1 = [Child new]; Child *c2 = [Child new]; [c1 setName:@"Gain"]; [c2 setName:@"abel"]; [c1 eatApple];
但是从圣经里知道,该隐和亚伯在出生后,并不安生,最后该隐杀掉了自己的亲兄弟亚伯。
摊手。果然子类也会有自己独特的“方法”啊。
- (void)kill { NSLog(@"该隐杀掉了亚伯! "); }
子类Child,也就是c1,c2,在声明了自己的函数之后就可以直接调用了。
[c1 kill]; [c2 kill];
说完了西方的神话故事。再回到小时候我们看过的动画片《葫芦娃》!
这里可以使用分类(category)概念。
先创建一个葫芦兄弟的类吧 。
@interface Brothers : NSObject - (void)sayMyName; @end @implementation Brothers - (void)sayMyName { NSLog(@"我们是葫芦兄弟!") } @end
那么分类是怎么使用的呢?
回忆一下,是不是每一个葫芦娃都有自己的本领呢?这就是分类的概念了。
@interface Brothers (1st) - (void)qianLiYan; @end @implementation Brothers (1st) - (void)qianLiYan { NSLog(@"千里眼!"); } @end @interface Brothers (2nd) - (void)shunFengEr; @end @implementation Brothers (2nd) - (void)shunFengEr { NSLog(@"顺风耳!"); } @end
有了通俗的例子之后,理解分类应该容易很多了。
严格的说,分类的作用就是不改变类原有代码的基础上,为类添加一些方法,也只能添加方法,并不能添加成员变量。作为同一个类,分类可以访问原类声明中的成员变量。
分类的优先级很高,如果在分类中重新实现了一个原类的方法,那么使用的时候会优先调用分类。
说起方法调用的优先级:“分类 > 类 > 父类”。也就是说,在分类能找到的方法,编译器不会再去其他地方寻找。若寻找不到,则去原类或者父类甚至父类的父类中去寻找。
搜索
复制
相关文章推荐
- 经典面试题集锦
- Java 40个集合面试问题和答案
- 黑马程序员--面向对象知识点总结(一)
- 黑马程序员——反射
- 面试题20:打印矩阵
- 打磨程序员的专属利器——命令行&界面
- 面试题19:二叉树的镜像
- 黑马程序员—基础学习 _常用类( 2)
- 黑马程序员—基础学习 _常用类( 1 )
- 面试题:throws和throw的区别
- 面试题18:树的子结构
- 面试题17:合并两个排序的链表
- 面试题15:输入一个链表,输出该链表中倒数第k个结点。
- 面试题16:反转链表
- 展望未来,总结过去10年的程序员生涯
- 黑马程序员——IO流8:IO流综合练习
- 黑马程序员-Java之匿名内部类
- 黑马程序员——正则表达式和网页爬虫
- 黑马程序员——IO流7:其他IO技术介绍-下
- 面试题14:调整数组顺序