#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.人类都有一个打招呼的行为 中国人:握手 日本人:鞠躬 欧洲人:拥抱...
动物都可以睡觉 鱼类:睁着眼睡 人:躺着睡 |