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.人类都有一个打招呼的行为

中国人:握手

日本人:鞠躬

欧洲人:拥抱...


动物都可以睡觉

鱼类:睁着眼睡

人:躺着睡

1 个回复

倒序浏览
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马