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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始




#pragma mark - Day05_01_NSObject类

1.NSObject是Foundation框架中的一个类,是OC中最根本的一个类

2.自己定义的类,都必须直接或者间接的继承自NSObject
HMStudent : HMPerson : NSObject
这样才能拥有NSObject类中定义的所有成员变量以及方法,才具备一个类应该有的最基本的功能和特性
比如:new方法 和 isa
description

内存管理的方法

3.NSObject类是OC中所有类的祖宗.
OC中的所有类都是从NSObject派生出来的

#pragma mark - Day05_02_super关键字
1.是什么
super是一个关键字,可以用在对象方法和类方法中,用来指代当前类的父类或者父类对象
使用super表示从父类中去寻找方法的实现,然后由当前对象调用

HMStudent : HMPerson
- (void)test {
    [super sayHi];
}

HMStudent *student = [HMStudent new];
[student test];

2.有什么作用:
1.在对象方法中使用super
    1.使用super调用从父类继承过来的对象方法
    2.在对象方法中,可以使用self和super两种方式调用父类的对象方法,但是使用super可读性更好,可以明确表示这个方法是属于父类的
    3.不能使用super调用当前类的对象方法
2.在类方法中使用super
    1.使用super调用从父类继承过来的类方法
    2.在类方法中,可以有以下几种方式调用父类中的类方法
        1.直接使用父类名
        2.直接使用子类名
        3.使用self
        4.使用super,可读性更好,可以明确表示这个方法是属于父类的
    3.不能使用super调用当前类的类方法

3.注意点:
    不能使用super访问父类中的成员变量

4.super的意义:
    1.但是使用super可读性更好,可以明确表示这个方法是属于父类的
    2.如果在类中重写父类方法的时候,想先调用父类方法,然后在此基础上增加功能,这个时候,必须要使用super(super的必用场景)


#pragma mark - Day05_03_属性的访问修饰符
1.访问修饰符
作用:限定类的成员变量可以被访问的范围
注意:只能用来修饰成员变量,不能用来修饰方法

2.访问修饰符的分类
@private 私有的
被@private修饰的成员变量,只能在当前类的内部进行访问,在当前类的外部及其子类中,都无法访问
子类会继承父类中的私有的成员变量,但是不能直接进行访问
对于父类中的私有的成员变量,可以通过该变量对应的get方法以及set方法,间接进行访问

你父亲有100万,使用@private修饰,这100万肯定属于你的,但是你不能直接使用,每次使用的时候都需要找你父亲要

@protected 受保护的
被@protected修饰的成员变量,只能在当前类及其子类中进行访问,在当前类的外部无法访问

@public 公有的
被@public修饰的成员变量,可以在任何地方进行访问
缺点:导致类的成员变量不安全

@package 包
只能在当前target中进行访问,在开发到框架的时候,可能会用到.
如果在同一个target中,@package相当于@public
一般不常用,知道即可.

3.注意
1.如果没有明确说明访问修饰符的类型,默认是@protected
2.访问修饰符的作用域,从当前访问修饰符开始向下,直到下一个访问修饰符,或者大括号为止
3.千万不要使用@public,如果一个成员变量需要被外部访问,那么就对其封装get方法以及set方法

#pragma mark - Day05_04_私有属性
1. 使用@private修饰的成员变量,是私有的成员变量
2. 在@interface的大括号中定义的成员变量,如果使用@private,外界不能访问,但是可以看到,私有的不够彻底
写代码的时候,使用Xcode可以有提示,但是会加一条红线,表示该变量不能使用
3. 在@implementation的大括号中定义的成员变量,外界不能访问,也无法看到,是真正意义上的私有

4.注意点
    1.定义在@implementation当中的成员变量,无论使用什么修饰符进修时,都是无法访问的,可以理解为默认是@private
    2.@implementation和@interface中定义的成员变量,区别仅仅是无法看到,其它的特点都是一样的,也可以被子类继承

子类继承自父类,就会拥有父类所有的成员变量和方法,但是对于私有的成员变量和私有的方法,无法直接访问


#pragma mark - Day05_05_私有属性和私有方法的应用

1.访问修饰符,只能用来修饰成员变量,而不能用来修饰方法
2.在使用一个类的时候,导入的是类的.h文件,也就是说在.h中的所以内容,外界都可以知道
3.如果在一个类的成员变量或者方法,不想让外界知道,那么久不要写在.h中,而是放在.m文件中
4.OC的方法,可以不在.h中声明,直接在.m中实现,这样的方法,只能在当前类的内部使用,外界无法访问,称为私有方法

5.如果一个类的方法和成员变量不想让外界知道,那么可以直接写在@implementation中
6.私有的成员变量和私有的方法,都是可以被子类继承的,只不过子类不能直接访问

OC中有一些黑魔法,可以直接访问私有方法和私有成员变量,但是不推荐使用,因为会破坏封装
"补充
可以通过performSelector强制调用一个类中私有的方法
运行时机制 可以做很多丧心病狂的事情


#pragma mark - Day05_06_里氏替换原则
面向对象一个基本法则
1.里氏替换原则 LSP
定义:子类对象可以替换父类对象的位置,并且程序的功能不受影响

2. 原理:
    1.指针是父类类型,但是可以让它指向一个子类的对象,因为子类 is a 父类
    2.父类中的成员和变量和方法 ,在子类中都有,只会多不会少,所以不会影响程序的功能
3. 表现形式:
    父类指针指向子类对象

4.好处
    1.NSObject类型的指针,可以指向任意类型的对象, OC中有一个万能指针叫做id
    2.如果一个方法的参数是一个父类类型的指针,那么可以传入任意子类类型的对象,更加的灵活

5.局限性:
    只能通过父类类型的指针,访问父类中具有的成员变量和方法,不能访问子类中特有的成员变量和方法
    因为子类知道父类的实现,但是父类不知道子类中的实现

6.注意点;
千万不要写反, 不能使用是一个子类指针指向父类对象
学生 : 人类
学生是一个人
人是一个学生

"练习
写一个函数,函数要求传入一个任意一种动物对象,在函数中调用动物的叫方法
//思路
//1.写一个Animal类,有一个叫的方法
//2.写一个函数,无返回值,参数是一个Animal对象
//3.创建Dog,Cat类继承自Animal类

#pragma mark - Day05_07_方法重写
1.重写:子类按照自己的行为,重新实现父类中同名的方法.
2.子类重写父类的方法,会对父类中该方法的实现进行屏蔽
一旦子类重写了父类中的方法,那么使用子类对象调用该方法时,调用的是子类自己的实现,而不是父类当中的实现
3.子类在重写父类方法的时候,可以先调用父类中的实现,然后在此基础之上进行扩展,使用super调用父类中的该方法
    注意:千万不能使用self,否则会造成死循环


#pragma mark - Day05_08_多态
1.同一种行为,不同的表现形态

2.使用父类的指针指向子类对象,然后通过父类指针调用父类的某个方法,如果在子类中对该方法进行了重写,那么实际调用的子类中的实现

3.作用
    1.降低代码之间的耦合性
    2.增强代码之间的扩展性

4.人类都有一个打招呼的行为
中国人:握手
日本人:鞠躬
欧洲人:拥抱...

动物都可以睡觉
鱼类:睁着眼睡
人:躺着睡

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马