- 面向对象的三大特性
- 封装性
- 封装就是隐藏实现细节,仅对外公开接口。保证数据的安全性,一般情况下
- 继承性
- 当B类继承A类,那么B类就拥有A类所有的属性和方法
- 多态性
- 某一类事物的多种表现形态,程序种的多态是父类指针指向子类对象,没有继承就没有多态,提高了代码的拓展性
- 封装性
- getter setter
- setter:设置成员变量的值
- 一定是对象方法
- 一定没有返回值
- 一定以set开头
- 一定有参数,参数类型一定和需要设置的变量一致
- getter 获取成员变量的值
- 一定是对象方法
- 一定有返回值
- 一定没有参数
- setter:设置成员变量的值
- 点语法其实是调用了属性的getter setter方法
- 如果self在对象方法中,那么self就代表调用当前对象方法的那个对象
- 如果self在类方法中,那么self就代表调用当前类方法的那个类
- 我们只用关注self在哪一个方法中,如果在类方法那么就代表当前类,如果在对象方法那么久代表当前调用该方法的对象
- self的注意点
- self会自动区分类方法和对象方法,如果在类方法中使用self调用了对象方法,那么就会直接报错
- 不能再对象方法或者类方法中使用self调用当前self所在的方法
- self使用场景
- 可以再对象方法之间相互调用
- 可以在类方法之间相互调用
- 可以用于区分成员变量和局部变量
- 继承的优点
- 提高代码的复用性
- 可以让类与类产生关系,从而有了多态
- 只有满足一定条件的才能使用继承 xxx是xxx:安卓是手机,苹果是手机
- 想在子类中调用父类的方法可以使用super
- super在类方法,一定会调用父类的类方法
- super在对象方法中,一定会调用父类的对象方法
- 可以利用super在任意方法中调用父类的方法
- 动态类型:在编译时编译器只会检查当前类型对应的类中有没有需要调用的方法,在运行时,系统会自动判断其真实类型
Animal *al = [Dog new];
al在调用某个子类重写的方法时,实际上调用的是子类的该方法
如果al调用的是子类中新建的方法,则编译都不会通过
Dog *d1 = (Dog *)al;
- 在多态中,如果想要调用子类特有的方法,则必须强制类型转换为子类才可以
- 多态的使用场景eg:有猫,狗,老虎等多种子类,他们都属于动物这个父类,他妈每个子类都有自己独特的吃饭方法,这时人想要喂猫,喂狗等,就可以接收一个父类动物,父类调用吃的方法,父类会去调用每个单独的吃方法,这样可以提高代码的拓展性
- 实例变量修饰符(作用域:从出现的位置开始,一直待下一个修饰符出现),无论使用哪种成员变量修饰符修饰成员变量,我们都可以在其他类中看到这个变量,只是有些不能操作
- public
- 可以在其他类中访问,也可以在本类中访问,可以在子类中访问
- private
- 不可以在其他类中访问,可以在本类中访问 ,不可以在子类中访问(拥有但是不能访问)
- protected(默认情况下所有变量都是protected)
- 不可以在其他类中访问,可以在本类中访问,可以在子类中访问
- package
- 介于public和private中间的,如果在其他包中访问就是private的,如果是在当前代码所在包访问就是public的,在同一个包中可以在子类中访问
- public
- 可以通过[Person class] 获取当前类的名称
- description:只要使用%@打印某个对象,系统内部默认会调用父类的description方法,调用该方法会默认返回一个字符串,默认格式<类的名称,对象 地址>,实际带哦用的是对象方法-description
- 如果使用%@打印对象就会调用-号开头的
- 如果使用%@打印类对象就会调用+开头的
- 访问属性的方式
- p->age;
- [p age];
- p.age;
- self写在对象方法中就代表当前调用该方法的对象
- self.age;
- self-age;
- [self age];
- 在description中尽量不要使用self来获取成员变量,在description中利用%@输出self会造成死循环
- 私有变量: 实例变量(成员变量)既可以在interface中定义,也可以在@implementation中定义,写在@implementation中的成员变量,默认就是私有的成员变量,并且和private修饰的不一样,在@implementation中定义的成员变量在其他类中无法查看,也无法访问,只能在本类中访问,这个变量就是私有变量。
- 私有方法:只有方法的实现,没有方法的声明,在OC中没有私有的方法,因为OC是消息机制,在运行时才会真正去查看有没有这个方法
1. id pp = [Person new] [pp test] 2. Person *p = [Person new] [p performSelector:@selector(test)] //两种调用私有方法的办法