码迷,mamicode.com
首页 > 其他好文 > 详细

黑马程序员-----类的继承和派生概念

时间:2015-12-21 01:48:20      阅读:163      评论:0      收藏:0      [点我收藏+]

标签:

------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -----

 

第一讲 类的继承和派生概念

 

本小节知识点:

1、【理解】什么是继承?

2、【掌握】类的继承和派生概念

 

1、什么是继承?

2OC中的继承与派生

  1 #import <Foundation/Foundation.h>
  2 
  3 @interface Animal : NSObject
  4 {
  5     @public
  6    //动物得年龄
  7     int  _age;
  8     
  9 }
 10 -(void)eat:(NSString *)foodName;
 11 -(void)run;
 12 @end
 13 
 14 #import "Animal.h"
 15 
 16 @implementation Animal
 17 -(void)eat:(NSString *)foodName{
 18     NSLog(@"正在吃:%@",foodName);
 19 }
 20 -(void)run{
 21     NSLog(@"动物正在跑");
 22 }
 23 @end
 24 
 25 #import <Foundation/Foundation.h>
 26 #import "Animal.h"
 27 //狗这个类要继承动物类
 28 
 29 //如何继承
 30 //1)导入要继承得那个类得头文件
 31 //2)@interface Dog :父类名
 32 //                     Animal
 33 @interface Dog : Animal
 34 -(void)lookHome;
 35 @end
 36 
 37 #import "Dog.h"
 38 
 39 @implementation Dog
 40 -(void)lookHome{
 41     NSLog(@"狗已经进入警戒状态!");
 42 }
 43 @end
 44 
 45 #import "Animal.h"
 46 
 47 @interface Cat : Animal
 48 {
 49 }
 50 -(void)catchMouse;
 51 @end
 52 
 53 #import "Cat.h"
 54 
 55 @implementation Cat
 56 -(void)catchMouse{
 57     NSLog(@"猫正在抓老鼠!");
 58 }
 59 @end
 60 
 61 #import "Dog.h"
 62 
 63 @interface JunDog : Dog
 64 {

 66 }
 67 -(void)zhaDiaoBao;
 68 @end
 69 
 70 #import "JunDog.h"
 71 
 72 @implementation JunDog
 73 -(void)zhaDiaoBao{
 74 
 75     NSLog(@"军犬叼起炸药包迅速得跑了");
 76 }
 77 @end
 78 
 79 #import "Dog.h"
 80 
 81 @interface BigYellowDog : Dog
 82 -(void)catchMouse;
 83 @end
 84 
 85 #import "BigYellowDog.h"
 86 
 87 @implementation BigYellowDog
 88 -(void)catchMouse{
 89 
 90     NSLog(@"狗拿耗子,多管闲事!");
 91 }
 92 @end
 93 
 94 #import <Foundation/Foundation.h>
 95 #import "Animal.h"
 96 #import "Dog.h"
 97 #import "BigYellowDog.h"
 98 int main(int argc, const char * argv[])
 99 {
100 
101     @autoreleasepool {

// 104 Animal *ani = [Animal new]; 105 106 ani->_age = 1; 107 [ani eat:@"??"]; 108 [ani run]; 109 110 Dog *d1 = [Dog new]; 111 d1->_age = 3; 112 [d1 eat:@"一坨新鲜得。。。!!!"]; 113 [d1 run]; 114 [d1 lookHome]; 115 116 //BigYellowDog本身没有吃和跑得行为, 117 //但是BigYellowDog父类Dog有吃和跑得行为 118 //所以,BigYellowDog 也就有类,因为继承过来的 119 BigYellowDog *BYD = [BigYellowDog new]; 120 [BYD eat:@"同伴得一坨新鲜得。。。!!!"]; 121 [BYD run]; 122 [BYD catchMouse]; 123 } 124 return 0; 125 }

 

第二讲  基类和派生类之间的关系

本小节知识点:

1、【理解】基类和派生类之间的关系

2、【理解】方法的重写

 

1、基类和派生类之间的关系

   派生类不但拥有基类的属性和方法,同时还可以自己创建自己的属性和方法。

   派生类方法属性 = 基类方法属性 + 派生类自己新增的方法和属性

 

注意:

  1)基类的私有属性能被继承,不能被使用。

  2OC中的继承是单继承:也就是说一个类只能一个父类,不能继承多个父类

  3)继承的合理性:

      引用《大话西游》里的一句话来描述继承的。“人是人他妈生的,妖是妖他妈生的”

 

2、方法的重写

 方法的重写,从父类继承的方法,可能这个方法并不适合子类,可以在子类中重写父类的方法。

 1 #import <Foundation/Foundation.h>
 2 
 3 @interface Animal : NSObject
 4 {
 5 
 6 }
 7 -(void)eat;
 8 -(void)bark;
 9 @end
10 
11 #import "Animal.h"
12 
13 @implementation Animal
14 -(void)eat{
15   NSLog(@"动物会吃");
16 }
17 -(void)bark{
18 NSLog(@"动物会叫");
19 }
20 @end
21 
22 #import "Animal.h"
23 
24 @interface Dog : Animal
25 {
26 
27 }
28 -(void)eat;
29 -(void)bark;
30 @end
31 
32 #import "Dog.h"
33 
34 @implementation Dog
35 //把父类的方法,在子类中重新给实现了
36 //这种做法就称之为:方法的重写
37 -(void)eat{
38  NSLog(@"狗会吃");
39 }
40 -(void)bark{
41  NSLog(@"狗会叫");
42 }
43 @end
44 
45 #import <Foundation/Foundation.h>
46 #import "Animal.h"
47 #import "Dog.h"
48 int main(int argc, const char * argv[])
49 {
50 
51     @autoreleasepool {
52         //先查找当前类有没有eat和bark,
53         //如果有,先调用自己的,
54         //如果没有,查看父类有没有bark方法
55         //如果父类还没有,去父父类
56         //      如果有,就执行
57         Dog *d = [Dog new];
58         [d eat];
59         [d bark];
60     
61         //ani 调用它自己的吃和叫的方法
62         Animal *ani = [Animal new];
63         [ani eat];
64         [ani bark];
65     }
66     return 0;
67 
68 }

 

第三讲  继承的注意事项

本小节知识点:

1、【理解】继承的注意事项

2、【理解】继承体系中方法调用的顺序

 

1、继承的注意事项

    1)子类不能定义和父类同名的变量,但是可以继承父类的变量

    2OC类支持单一继承,不支持多继承

    3OC类支持多层继承

      Animal-->Dog--->junDog

 

2、继承体系中方法调用的顺序

  1.  在自己类中找
  2. 如果没有,去父类中找
  3. 如果父类中没有,就去父类的父类中找
  4. 如果父类的父类中也没有,就还往上找,直到找到基类(NSObject
  5. 如果NSObject都没有就报错了

 

第四讲  实例变量修饰符介绍

【理解】实例变量的作用域

1、实例变量的作用域

                                  public             任意程序集

  访问修饰符       

                                  protected         同一类和派生类

                                  private                同一类

 

1@public(公开的)在有对象的前提下,任何地方都可以直接访问。

         前提没有其他作用域,从写@public定义开始,一直到结束。

 

2@protected(受保护的)只能在当前类和子类的对象方法中访问。

   

3 @private(私有的)只能在当前类的对象方法中才能直接访问

 

 4@package(框架级别的)作用域介于私有和公开之间,只要处于同一个框架中就可以直接通过变量名访问

 

 

第五讲  实例变量修饰符对子类的影响

本小节知识点:

1、【掌握】变量修饰符在子类中的访问

2、【了解】实例变量作用域使用注意事项

 

1、变量的修饰符在子类中访问

  1@private私有成员是不能被继承,也不能被外部函数访问。

  2 @public 共有成员能被继承,也能被外部方法访问。

 3 @protected 保护成员能够被继承,不能够被外部函数访问。

 

2、实例变量作用域使用注意事项

  1)在@interface @end 之间声明的成员变量如果不做特别的说明,那么其默认是protected的。

   (2)一个类继承了另一个类,那么就拥有了父类的所有的成员变量和方法,注意所有的成员变量它都拥有,只是有的它不能直接访问。

    

 1 #import <Foundation/Foundation.h>
 2 
 3 @interface Animal : NSObject
 4 {
 5    @public
 6     int _age;
 7     
 8     @private
 9     int _tuiNum;
10     
11     @protected
12     float _weight;
13 }
14 
15 @end
16 
17 #import "Animal.h"
18 
19 @implementation Animal
20 
21 @end
22 
23 #import "Animal.h"
24 
25 @interface Dog : Animal
26 {
27 
28 }
29 -(void)run;
30 @end
31 
32 #import "Dog.h"
33 
34 @implementation Dog
35 -(void)run{
36     //@public 类型的变量,在子类中可以正常的访问和使用
37     //@protected类型的变量,在子类中使用,不能在其它类中使用
38     //@private类型的变量
39     
40     //面试题:
41     //@private类型的变量,能否被子类继承?
42     //子类可以继承父类的所有的实例变量和方法
43     //但是,不是所有的都可以访问
44     
45     //@private类型的变量,能否被子类访问?
46     //不能访问
47     
48     NSLog(@"public _age : %d",_age);
49     
50     _weight += 10;
51     NSLog(@"protect _weight = %.2f",_weight);
52     
53 //    NSLog(@"private  _tuiNum : %d",_tuiNum);
54     //此处是能继承过来,但不能访问
55     
56 }
57 @end
58 
59 #import <Foundation/Foundation.h>
60 #import "Animal.h"
61 #import "Dog.h"
62 int main(int argc, const char * argv[])
63 {
64 
65     @autoreleasepool {
66         
67         Dog *d = [Dog new];
68         d->_age = 1;
69         [d run];
70         
71     }
72     return 0;
73 }

 

第六讲 OC中的私有变量

【掌握】OC中的私有变量

1OC中的私有变量

    1)在类的实现 .m文件中 也可以声明成员变量,但是因为在其他文件中通常都只是包含头文件而不会包含实现文件,所以在.m文件中声明的成员变量是@private的。 .m中定义的成员变量不能和它的头文件.h中的成员变量同名,在这期间使用@public等关键字也是徒劳的。

 

       

 1 #import <Foundation/Foundation.h>
 2 
 3 @interface Person : NSObject
 4 {
 5     int _age;  //默认的是protect类型,能在当前类和子类中使用
 6     
 7     @private
 8     NSString *_name;  //_name 不能在子类中使用,但是可以被子类继承
 9     
10 }
11 -(void)run;
12 -(void)eat;
13 @end
14 
15 #import "Person.h"
16 
17 //在.m中定义实例变量
18 //纯私有的变量,改变量只能在当前类中使用,不能被子类继承,也不能被访问
19 
20 int m = 100;
21 @implementation Person
22 -(void)run{
23 
24     NSLog(@"人在走,速度是%d!",m);
25 }
26 -(void)eat{
27     NSLog(@"eat m = %d",m);
28 }
29 @end
30 
31 #import "Person.h"
32 
33 @interface Student : Person
34 
35 @end
36 
37 #import "Student.h"
38 //int  m = 10;
39 @implementation Student
40 -(void)run{
41     
42     //Person类的实现类.m文件中定义的变量,此处不能使用
43 //    NSLog(@"人在走,速度是%d!",m);
44 }
45 @end
46 
47 #import <Foundation/Foundation.h>
48 #import "Person.h"
49 int main(int argc, const char * argv[])
50 {
51 
52     @autoreleasepool {
53         
54         Person *p = [[Person alloc] init];
55         
56         [p run];
57         [p eat];
58         
59     }
60     return 0;
61 }

 

 

第七讲  oc中的私有方法

【掌握】OC中的私有方法

 1OC中的私有方法

   .h  中没有声明

     .m中实现,此时该方法被称为私有方法

  1 #import <Foundation/Foundation.h>
  2 
  3 @interface Person : NSObject
  4 {}
  5 -(void)run;
  6 
  7 @end
  8 
  9 #import "Person.h"
 10 
 11 @implementation Person
 12 -(void)run{
 13     NSLog(@"人在走");
 14     
 15     Person *p1 = [Person new];
 16     [p1 test];
 17     
 18     //可以访问私有方法
 19     [self test];
 20 }
 21 
 22 //test方法,没有在.h文件中声明,在.m中实现了
 23 //不能被子类继承和访问
 24 
 25 
 26 -(void)test{
 27 
 28     NSLog(@"test!");
 29 }
 30 @end
 31 
 32 #import "Person.h"
 33 
 34 @interface Student : Person
 35 
 36 @end
 37 
 38 #import "Student.h"
 39 
 40 @implementation Student
 41 
 42 @end
 43 
 44 #import <Foundation/Foundation.h>
 45 #import "Student.h"
 46 #import "Person.h"
 47 int main(int argc, const char * argv[])
 48 {
 49 
 50     @autoreleasepool {
 51         
 52         //创建一个stu对象
 53         Student *stu = [Student new];
 54         
 55         [stu  run];
 56        
 57 //        [stu test];  //没有声明
 58         Person *p = [Person new];
 59         [p run];
 60         
 61 //        [p test];
 62     }
 63     return 0;
 64 }
 65 
 66 #import <Foundation/Foundation.h>
 67 
 68 //.h文件可以看作是对外的一个接口
 69 @interface Animal : NSObject
 70 {
 71 
 72  }
 73 -(void)run;
 74 @end
 75 
 76 #import "Animal.h"
 77 
 78 @implementation Animal
 79 -(void)run{
 80 
 81     NSLog(@"动物正在跑");
 82     
 83     //调用eat 
 84     [self eat];
 85 }
 86 
 87 //私有方法(相对私有)
 88 //不能被子类继承
 89 -(void)eat{
 90 
 91   NSLog(@"动物正在吃");
 92 }
 93 @end
 94 
 95 #import "Animal.h"
 96 
 97 @interface Dog : Animal
 98 
 99 @end
100 
101 #import "Dog.h"
102 
103 @implementation Dog
104 
105 
106 -(void)test{
107    //私有方法不能被子类继承
108 //    [self eat];
109 }
110 @end
111 
112    
113 
114         //创建一个Animal对象
115         Animal *ani = [Animal new];
116         [ani run];
117         
118         //eat 没有在.h中声明
119 //        [ani eat];
120         
121         Dog *d = [Dog new];
122         [d run];
123         [d eat ];

 

 

第八讲  description方法介绍及重写

本小节知识点:

1、【掌握】description方法概述

2、【掌握】description重写的方法

3、【了解】description陷阱

 

1description方法概述 

2description重写的方法

 

//对象的description方法

  -(NSString *)description{

   return [NSString stringWithFormat:@"",  ];

}

//类的description方法

+(NSString *)description{

  return @"+开头的方法";

}

 

3description陷阱

 千万不要在description方法中同时使用%@self,下面的写法是错误的:

-(NSString *)description{

  return [NSString stringWithFormat:@"%@",self];

}

同时使用了%@self,代表要调用selfdescription方法,因此最终会导致程序陷入死循环,循环调用description方法。

 1 #import <Foundation/Foundation.h>
 2 
 3 @interface Dog : NSObject
 4 {
 5     int _age;
 6     
 7     @public
 8     int _color;
 9 }
10 -(void)run;
11 -(void)setAge:(int)age;
12 -(int)age;
13 @end
14 
15 #import "Dog.h"
16 
17 @implementation Dog
18 -(void)run{
19 
20     NSLog(@"狗在跑");
21 }
22 -(void)setAge:(int)age{
23 
24     _age = age;
25 }
26 -(int)age{
27     return _age;
28 }
29 //重写父类的description
30 -(NSString *)description{
31    // NSString *str = [NSString stringWithFormat:@"年龄:%d,颜色:%d",_age,_color ];
32   return [NSString stringWithFormat:@"年龄:%d,颜色:%d",_age,_color ];
33 }
34 +(NSString *)description{
35 //类方法中不能访问实例变量,所以下面的写法是错误的
36 // return [NSString stringWithFormat:@"年龄:%d,颜色:%d",_age,_color ];
37     
38     return @"这是类方法";
39 }
40 @end
41 
42 #import <Foundation/Foundation.h>
43 #import "Dog.h"
44 int main(int argc, const char * argv[])
45 {
46 
47     @autoreleasepool {
48         
49         Dog *d = [Dog new];
50         [d setAge:3];
51         d->_color = 1;
52         [d run];
53         
54         //查看对象的地址
55         NSLog(@"d = %p",d);
56         
57         //查看对象实例变量的值
58         NSLog(@"%d",[d age]);
59         
60         //NSString *str = @"abc";
61         //NSLog(@"%@",str);
62         //<Dog: 0x100202ed0>
63         // 类名  对象的地址
64         NSLog(@"\n %@",d);//打印d的对象
65         //当我们以%@的格式,打印了对象d,此时调用了对象的descripiton方法
66         //对象中如果没有重写父类的description方法,则调用父类的
67     
68         //需求:
69         //当我们以%@格式打印对象的时候,输出对象的所有属性信息
70         //在方法中重写description方法
71         //对象的description方法
72          //-(NSString *)description{
73 //        return [NSString stringWithFormat: ];}
74          //类的description方法
75 //        +(NSString *)description{
76 //        return @"+开头的方法";}
77         
78         //打印类的信息
79         //打印类
80         // [d class];  --->Dog
81         //以%@的形式,打印类信息
82         NSLog(@"%@",[d class]);
83     
84     }
85     return 0;
86 }

 

黑马程序员-----类的继承和派生概念

标签:

原文地址:http://www.cnblogs.com/xiaokang520/p/5062342.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!