面试题答案
一键面试1. +load方法执行顺序
- 执行顺序为:类A的+load -> 类B的+load -> 类C的+load。
- 原因:+load方法会在类被加载到内存时调用,而且只会调用一次。加载类的顺序是按照继承体系自顶向下的,所以先加载类A,调用类A的+load;接着加载类B,调用类B的+load;最后加载类C,调用类C的+load 。
2. +initialize方法执行顺序
- 执行顺序为:类A的+initialize -> 类B的+initialize -> 类C的+initialize。
- 原因:+initialize方法是在类或其分类的第一个方法被调用之前调用,而且也是只会调用一次。由于类A是基类,所以在第一次使用类层次结构中的任何类时,会先初始化类A,调用类A的+initialize;如果后续使用到类B,会初始化类B,调用类B的+initialize(如果类B没有重写,会调用继承自类A的实现,但也算作类B的初始化);同理,使用到类C时,会调用类C的+initialize 。
3. 类B重写+load与+initialize方法的影响
- +load方法:执行顺序依旧是类A的+load -> 类B重写的+load -> 类C的+load。因为+load是基于类加载顺序调用,重写不影响其按继承体系自顶向下的加载和调用顺序。
- +initialize方法:执行顺序还是类A的+initialize -> 类B重写的+initialize -> 类C的+initialize。因为在初始化过程中,当使用到类B时,会调用类B重写的+initialize方法来完成类B的初始化,类C同理,使用类C时会调用类C的+initialize(如果类C没有重写,会按继承链调用合适的+initialize实现)。