OC 知识复习 (四) 继承

20240202032505_image.png

  1. C语言中的static

     a.修饰局部变量,
     b.修饰全局变量,
     c.修饰函数
    
    copy success
  2. OC中的static关键字

    a.static不能修饰属性 也不能修饰方法。 b.static可以修饰方法中的局部变量。

     如果方法中的局部变量被static修饰,那么这个变量就会被变成静态变量 存储在常量区 
     当方法执行完毕之后 不会回收 下次再执行这个方法的时候 直接使用 而不会再声明了。
    
    copy success
  3. 如果方法的返回值是当前类的对象,那么方法的返回值就写instancetype


1.在方法的内部可以定义1个和属性名相同的局部变量。
	这个时候 如果在方法中访问这个同名的变量,访问的是局部变量,
		问题1:如果这个时候我就是要访问那个同名的属性,怎么办?
		问题2:在1个对象方法中要调用当前对象的另外1个对象方法怎么办?

2.self:自己的.
	可以在对象方法和类方法中使用
	self是1个指针,在对象方法中self指向当前对象,在类方法中self指向当前类,
	
3.对象方法中使用self的场景
	a.必须使用self的场景,
		如果在方法中存在和属性同名的局部变量’你如果想要访问同名的局部变量,直接写就可以了。			你如果想要访问当前对象的同名属性 必须使用self
		在对象方法中,如果要调用当前对象的其他的对象方法 必须使用self.
		
4.把self用在类方法中
	1).类加载。当类第1次被访问的时候 会将类的代码存储在代码区,
			代码区中用来存储类的空间也有1个地址,
	2).在类方法中 self也是1个指针,指向当前这个类在代码段中的地址(和 isa 值一样)。
		self 在类方法中 就相当于是当前这个类, 
		
	3).总结1下取到类在代码段中的地址的方式,
		a.调试查看对象的isa指针的值,
		b.在类方法中查看self的值,
	  c.调用对象的对象方法class 就会返回这个对象所属的类在代码段中的地址,[对象 class]
		d.调用类的类方法class 就会返回这个类在代码段中的地址,[类名 class]
	
5.对象方法可以声明多次,但是只会认为有1次,对象方法如果有多次声明只能实现1次 
	否则就会报错,
	对象方法之间是不能重名的。
	类方法之间也是不可以重名的。
	但是,对象方法和类方法是可以重名的。 
	
6.注意
	1).在对象方法中,self代表当前对象,所以可以通过self访问当前对象的成员,
		在对象方法中 不能使用self调用本类的类方法。
	2),在类方法中,self代表当前这个类,
		所以,可以通过self调用当前类的其他的类方法,
		在类方法中不能使用self访问对象的成员。
copy success

5.几个术语:

@interface Student : Person
1).Student类从Person类继承,Studdent类是Person类的子类 Person类是Student的父类 
2).Student类从Person类派生,Student类是Person类的派生类,Person类是Student类的基类 
	子类一旦从父类继承 就意味着子类拥有了父类的所有的成员 而不用自己去定义。
copy success

  1. 在新创建类模块的时候 指定父类,Xcode就会自动的帮助你完成一系列的事情,

  2. 继承是类在继承,而不是对象在继承, 子类从父类继承,子类中就拥有了父类中定义的所有的成员。只是类继承 我们创建对象。对象与对象之间是毫无关系的,

  3. 什么时候应该使用继承? 如果发现另外1个类中的成员我也想有 那么这个时候就可以使用继承,

    满足继承的关系 is a 凡是满足is a关系的类 就可以拥有继承的关系,当A类是1个B类的时候 那么A类就可以从B类继承


3.NSObject类

是Foundation框架中的类,在这个类中有1个类方法new这个方法是用来创建对象的,方法的返回值是创建的这个对象的指针 也就是说,如果要创建类的对象,就必须要调用这个new方法 如果我们想要让我们的类具备创建对象的能力,就必须要让我们的类直接的或者间接的从NSObiect类继承 所以.要求:我们写的类必须直接的或者间接的要NS0bject类继承,如果你不继承,我们的类就无法创建对象,那么我们的类就毫无意义,


2.super关键字

1).可以用在类方法和对象方法之中,
2).在对象方法中可以使用super关键字调用当前对象从父类继承过来的对象方法
3).在类方法中 super关键字可以调用当前类从父类继承过来的类方法,
	a.类方法也能被子类继承。 父类中的类方法可以使用父类名来调用 也可以使用子类名调用,
	b.在子类的类方法中 可以使用super关键字调用父类的类方法,
4),super只能用来调用父类的对象方法或者类方法 不能用来访问属性。	
copy success

1.访问修饰符:用来修饰属性,可以限定对象的属性在那1段范围之中访问

@private:私有 被@private修饰的属性只能在本类的内部访问,只能在本类的方法实现中访问。
@protected:受保护的。被@protected修饰的属性只能在本类和本类的子类中访问。只能在本类和子类的方法实现中访问,
@package:被@package修饰的属性 可以在当前框架中访问,
@public:公共的.被@public修饰的属性 可以再任意的地方访问,
copy success

2.如果不为属性指定访问修饰符 那么默认的就是@protected

3.子类仍然可以继承父类的私有属性, 只不过,在子类中无法去直接访问从父类继承过来的私有属性,但是如果父类中有1个方法再为属性赋值或者取值。那么子类可以调用这个方法间接的访问父类的私有属性,

4.访问修饰符的作用域。 从写访问修饰符的地方开始往下,直到遇到另外1个访问修饰符或者结束大括弧为止。中间的所有的属性都应用这个访问修饰符,


  1. 我们刚才讲的@private修饰的属性就叫做私有属性,只能在类的内部访问, 但是在外界的时候,Xcode仍然会提示这个对象中有这个属性 只不过没权访问,我们想要实现的效果:真私有,让外界不知道对象里面有这么1个属性,

2.其实在@implementaion之中也可以写1个大括弧把属性定义在@implementation的大括弧之中 这里面的属性,是1个私有属性,各种访问修饰符无效,外界根本就不会提示,

将属性定义在@implementation之中 和 将属性定义在@interface之中并标记为@private唯一的区别:提示和不提示,都不能在外界访问,

3.私有方法, 方法不写声明,只写实现。那么这个方法就是1个私有方法,只能在本类的其他方法中调用 不能再外界调用。


1,里氏替换原则(LSP) 子类可以替换父类的位置,并且程序的功能不受影响。 为什么? 1),父类指针迫切的需求要1个父类对象,而我们给了1个子类对象,这是完全没有问题的,因为子类就是1个父类嘛, 2)。因为父类中拥有的成员 子类都有。所以不会影响程序的功能,

2.里氏替换原则的表现形式, 当1个父类指针指向1个子类对象的时候,这里就有里氏替换原则,

3.LSP的作用。

1). 1个指针中不仅可以存储本类对象的地址还可以存储子类对象的地址
2). 如果1个指针的类型是NS0bject类型的,那么这个指针中可以存储任意的0C对象的地址,
3). 如果1个数组的元素的类型是1个OC指针类型的 那么这个数组中不仅可以存储本类对象还可以存储子类对象。
4). 如果1个数组的元素是NS0biect指针类型 那么意味着任意的0C对象都可以存储到这个数组之中。
5). 如果1个方法的参数是1个对象,那么我们在为这个参数传值的时候,可以传递1个本类对象 也可以传递1个子类对象,对方法中的代码不会有丝毫的影响。
copy success
  1. 当1个父类指针指向1个子类对象的时候,这个时候,通过这个父类指针就只能去调用子类对象中的父类成员,

4.当1个父类指针指向1个子类对象的时候,通过这个父类指针调用的方法 如果在子类对中重写了。调用的就是子类重写的方法,


  1. description方法是定义在NS0bject类之中的,所以每1个OC对象都有这个方法, 这个方法在NS0bject类中的实现是这样的: 返回的字符串格式 @"<对象所属的类名:对象的地址>" 可以通过重写这个方法实现打印自定义类返回格式