黑马程序员-[OC语言] 第二篇:继承、多态概述

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------

OC基础--第四天学习总结:

1. self 关键字的介绍;
1) self 指代的是当前的类;[P  class]返回值实质就是当前的类;
2)self在对象中使用时,指代的是在调用当前对象方法的那个对象
3) 在修饰变量中使用。
使用的注意事项:
1)谁调用当前方法,self就指代谁。
2)[self  方法名]:调用其它方法(类方法/对象方法)
3)类方法中,self指代的是当前类,此时通过类对象,只能调用类对象,不能调用类方法。


2.类的继承和派生注意点:
1)基类的私有属性不能被继承;
2)OC中的继承是单继承:一个类只能继承几个父类,不能继承多个父类
3)注意继承类的合理性;
4)子类不能定义和父类同名的变量,但是可以继承父类的变量;


3.继承体系中方法调用顺序:
1)在自己类中查找;
2)如果没有,去父类中查找;
3)如果再没有,就还往上找,直到找到基类NSOject 中;在没有就会提示错误信息;


4.  实例变量修饰符,主要有:
1)Public:公开的,在任何地方通过实例对象都可以访问和使用;
2) protected   受保护的,表示只能在当前类和子类中使用;
3) private    只能在本类中被访问,能被子类继承,但是不可以访问;
4)peckage    (框架级别的)作用域介于私有和共有之间,只要处于同一个框架之中就可以直接通过变量名访问。


5.OC中的私有变量:

1)在类的声明中用@private 关键字修饰,那么该变量只能在本类中使用,可以被继承,但是不可以被访问。
2)在类的声明中用@protected 关键字修饰,该变量只能在本类和子类中使用
3)在类扩展中定义的成员变量,是私有的
4)在.m文件中定义的变量,是纯私有的变量,不能被继承,也不能被访问。
5)利用@property 生成的下划线实例变量也是属于纯私有的。

6. OC中的私有方法:
定义:在.h 中没有声明,在.m 中实现,此时该方法被称为私有方法。此方法不能被子类继承和访问。


7.description  方法的重写:
1)当我们以%@ 的格式,打印了对象d 此时调用了对象的description 方法,如果对象中没有重写父类的description 方法,则调用父类的。
格式为:NSlog(@“%@”,d)  d为一个实例对象
2)当我们以%@ 格式打印对象的时候,输出对象的所有属性信息。
格式为:NSlog (@“%@”,[d class]); d为一个实例对象;输出父类中的信息。
3) 重写父类方法为:

-(NSString *)description{return

[NSString stringWithFormat:@"年龄:%d,颜色:%d",_age,_color];
}
+(NSString *)description{return @“这是类方法”;}

8.多态性:
1)概念:不同的对象以自己的方式响应父类的方法,这就是多态性;
2)体现:父类的指针指向了子类的对象;
3)实现条件:有继承关系;有方法重写(子类把父类的方法给重写了);
4)多态的原理:动态类型能使程序知道执行时才确定对象所属的类型;
动态类型的绑定能使程序执行时才确定要对对象调用的实际方法。
Id 类型:通过指针类型,弱类型,编译时不进行类型检查;


9.类的本质:
1)类的本质其实也是一个对象(类对象)
如何获取类对象:通过类的实例对象来获取类对象;如:[d  calss];通过类名获取类对象[Dog class];
2)可以用来实例化实例对象;


10.类对象的存储细节:
黑马程序员-[OC语言] 第二篇:继承、多态概述_第1张图片

11.SEL 全称select 表示方法的存储位置;
手动的test 方法包装成SEL类型
SEL s1=@selector(test);
[P performSelector:s1];响应方法;


OC基础--第5天学习总结:

1.点语法的应用:
点语法是Xcode的特性,Xcode 帮我们做代码替换;
一般点语句出现在等号左边时,替换set语句,等号右边时,替换为get方法;
使用注意事项:和 self一起使用时,注意构成死循环的条件;


2.@property 关键字的使用:
1)格式:@property   类型名   方法名(去掉set);
2)  作用:@property 用来告诉编译器声明属性的访问器getter /setter方法;


3) 注意事项:
(1)只能写在@interface  @end之间;
(2)@property 用来自动生成成员变量的get /set 方法的声明;

3. @synthesize关键字的使用:
1)格式:@synthesize 方法名
2)作用:主要用来在.m 文件中实现get/set 方法的实现;
3)@property int a     @aynthesize   a=_b   表示用a的get/set 方法,修改属性 b 的值;


4.@property 增强使用;
Xcode4.4 之后,可以只使用@property 而不用使用@synthesize   ,此时声明和实现了 _age  _name  的get/set 方法,操作的带下划线的实例变量; 如果我们当前类没有下划线的实例变量,则系统会帮我们生成;但是生成的_age  _name 都是私有的,不能被子类继承和访问;

5. 在@property 下重写  get/set 方法;
只有@property 时,get/set 方法只能重写一个,两者同时重写时会报错!

6.动态类型和静态类型;
动态类型:程序直到执行时才确定所属的类;
静态类型:将一个变量定义为特定类的对象时,使用的是静态变量;

7.Id 类型及应用场景;
1)Id  是一种通用的对象类型,它可以用来存储属于任何类的对象;也可以理解为万能指针;
2)NSObject 和id 都可以指向任何对象,NSObject对象会进行编译时检查(需要强制类型的转换),Id  却可以直接使用,编译器看到后,认为是动态类型,不在检查类型。

8.动态类型检测方法:
1)动态绑定:在OC中,一个对象内能否调用指定的方法不是由编译器决定的而是由运行时决定的。这被称为方法的动态绑定;
2)动态类型检测方法:
(1)判断类型:—(bool)iskindofClass:classObj   判断某个实例对象,是否是这个类的实例对象,或者是这个类的子类的实例对象。使用格式为:[对象  iskindofclass 类对象];
(2)—(bool)isMemberofClass:classObj    判断对象是否是指定类的实例对象,不管是不是这个类的子类实例变量;格式为:[对象   isMemberofClass   类对象];
 (3)—(bool)isSubclassofClass:classObj 判断类是否是指定类的子类(类和类的关系);  格式为:[类A名   isSubclassofClass    类B对象];

以下实例程序是在建立Person、Animal、Dog类后,且Dog继承了Animal类后

#import 
#import "Dog.h"
#import "Person.h"
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        
        Animal *ani = [Animal new];
        //1、判断类型
        
        //1)判断某个对象是否是类的实例对象,或者子类的实例对象(对象和类)
        //isKindOfClass使用格式:[对象 isKindOfClass 类对象];
        
        BOOL isInstance = [ani isKindOfClass:[Animal class]];
        //1     ani是 Animal类的实例
        
        Dog *dog = [Dog new];
        isInstance = [dog isKindOfClass:[Animal class]];
        // 1     dog是Animal子类Dog的实例对象,所以是1
        
        
        Person *p = [Person new];
        isInstance = [p isKindOfClass: [Animal class]];

        
        //2) isMemberOfClass 判断对象是否是指定类的实例对象(对象和类)
        //   格式:  [对象  isMemberOfClass: 类对象]
        //0    dog不是我们 Animal类的子类
        isInstance = [dog isMemberOfClass:[Animal class]];
        //1    ani是 Animal类的实例
        isInstance = [ani isMemberOfClass:[Animal class]];
        //1    p 是 Person类的实例
        isInstance = [p isMemberOfClass:[Person class]];
    
        
        NSLog(@"%d",isInstance);
        
        
        //3、判断类是否是指定类的子类(类和类之间的关系)
        //格式: [类A isSubclassOfClass:类B];
        //     判断类A是否是类B的子类  是 YES   不是 NO
        //Dog   Animal
        
        //    1       Dog 类继承自 Animal
        BOOL isSub = [Dog isSubclassOfClass:[Animal class]];
        //       通过对象来获取类对象
        isSub = [[dog class] isSubclassOfClass:[ani class]];

        isSub = [Dog isSubclassOfClass:[Animal class]];
       
        // 0     Person 不是 Animal的子类
        isSub = [Person isSubclassOfClass:[Animal class]];
        // 0     Animal不是Dog的子类
        isSub = [Animal isSubclassOfClass:[dog class]];
        
        NSLog(@"isSub = %d",isSub);
        
    }
    return 0;
}

9.判断对象是否能响应方法:
1) 判断实例对象能否响应(调用)指定的方法:
格式为:[实例对象   respondsToSelector  SEL]通常把方法通过@selector(方法名)包装成SEL类型。
2)判断类中有没有(调用)指定的方法;主要用到
+(bool)instancesRespondsToSelector 方法        
格式为:[类名   instancesRespondsToSelector    SEL(要包装方法的指针)];

在类的建立与8题相同:

#import 
#import "Dog.h"
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        
        //动态类型检测的第二部分
        //1、方法响应的检测
        Animal *ani = [Dog new];
        SEL s1 = @selector(eat); //把eat包装成SEL类型
        //    0
        BOOL isRespond = [ani respondsToSelector:s1];
        
        
        if (isRespond) {
            //
            [(Dog *)ani eat];
        }else{
        
            NSLog(@"该对象不能调用此方法!");
        
        }
        //2)判断类中有没有(调用)指定的方法
        // 1
        isRespond = [Dog instancesRespondToSelector:s1];
        // 1
        isRespond = [Dog instancesRespondToSelector:@selector(run)];
        // 0  Dog 类中,没有定义test方法
        isRespond = [Dog instancesRespondToSelector:@selector(test)];
        
        NSLog(@"isRespond = %d",isRespond);
    }
    return 0;
}

10.响应方法(调用方法):
1) performSelector 响应方法 格式为:[实例变量  performSelector   SEL要包装方法的指针)] 此时直接执行此方法;此时无参数:
2)
通过performSelector: withObject:响应有参的方法

SEL s2 = @selector(eat:);
[ani performSelector:s2 withObject:@“(要传递参数)”];
3)通过performSelector: withObject: withObject:响应有两个参的方法
 [ani performSelector:@selector(eat:andFoodName:) withObject:@"(要传递参数)" withObject:@“(要传递参数)"];

11.构造方法概念:
1)OC中给对象进行初始化的方法就是:init 方法 ,该方法是一个对象方法,返回的是一个对象(调用init方法)。
2)重写父类init方法时,要首先要用super初始化父类的方法。

例如:

-(instancetype)init{

    if (self = [super init]) {
        //给士兵一把枪
        Gun *gun = [Gun new];  // 3 
        _gun = gun;
    }
    return self;
}

12 自定义构造方法:
1)是一个对象方法
2)返回值一般是Id 类型;
3)方法名一般以init 开头;

例如:

-(instancetype)initWithName:(NSString *)name andAge:(int)age{

    if (self = [super init]) {
        _name = name;
        _age = age;
    }

    return self;
}

注意事项:
1)自己做自己的事情;
2)父类的方法交给父类的方法来处理,子类的方法处理子自己独有的属性;


你可能感兴趣的:(黑马学习笔记-OC语言)